2016-05-13 3 views
0

У меня есть некоторые каталоги и файлы, выглядит следующим образом:Как рекурсивно выполнить кошку с несколькими трубами

/my/directories/directory0/ | -->File1.txt | -->File2.txt /my/directories/directory1/ | -->File1.txt | -->File2.txt /my/directories/directory2/ | -->File1.txt | -->File2.txt /my/directories/directory3/ | -->File1.txt | -->File2.txt

Эти CSV-файлы, и я пытаюсь получить 3-ю колонку подсчитывается, и сортируются от наивысшего до самого низкого.

Прямо сейчас я могу выполнить это, но только в каждом конкретном каталоге. Например, если я бегу это:

cd /my/directories/directory0/ cat *.txt | awk -F "," '{print $3}' | sort | uniq -c | sort -nr > finalOutput.txt

Тогда я получаю именно то, что я хочу, но только с данными в этом каталоге. Я хочу котать все из всех/my/directories/sub-каталогов в один файл.

Я попытался использовать ls или find, чтобы выполнить это, но я не могу заставить его работать. Я знаю, что вы можете рекурсивно кошка таким образом, похоже на это:

find /my/directories/ -name '*.txt' -exec cat {} \; > finalOutput.txt

Но я не смог получить эту работу с мульти конвейеру команды. Любая помощь приветствуется.

+1

Что случилось с 'найти/мои/каталоги/-name '* .txt' -exec кошки {} \; | awk ... '? –

+0

В этом нет ничего плохого. Я просто не знал правильного синтаксиса после флага -exec. Это правильный ответ, потому что он показывает ошибку в моем синтаксисе. – trueCamelType

ответ

1

Попробуйте с xargs:

$ find . -name "f?" | xargs awk -F, '{ print $3 }' | sort | uniq -c | sort -nr 
4 3 
1 z 
1 three 
1 c 
1 5 

$ find . -name "f?" -exec echo "File: " {} \; -exec cat {} \; -exec echo "----" \; 
File: ./d0/f1 
1,2,3 
---- 
File: ./d0/f2 
3,4,5 
---- 
File: ./d1/f1 
8,9,3 
---- 
File: ./d1/f2 
a,b,c 
---- 
File: ./d2/f1 
x,y,z 
---- 
File: ./d2/f2 
one,two,three 
---- 
File: ./d3/f1 
red,yellow,3 
---- 
File: ./d3/f2 
1,2,3 
---- 
+0

Это работает. Я также хотел бы указать всем, кто находит этот ответ, что комментарий Уильяма Пурселла по моему первоначальному вопросу также решает проблему, но, исправив мою первоначальную попытку. – trueCamelType

1
find . -name "File*" | xargs cut -d, -f3 | sort | uniq -c | sort -nr 
+0

Это возвращает только один столбец и не делает счет. – trueCamelType

+0

@trueCamelType Ну, и ваш пример, о котором вы говорите «Тогда я получаю именно то, что хочу». Итак, в основном, я не понимаю, чего вы пытаетесь достичь. –

+0

Из-за команды uniq внутри моего примера она возвращает более одного столбца. Он также подсчитывает количество вхождений. – trueCamelType