Список уникальных заголовков рекурсивно для файлов, соответствующих шаблону - PullRequest
0 голосов
/ 25 апреля 2019

Мне нужны уникальные заголовки для группы csv файлов, имена которых содержат ABC или XYZ.

В одном каталоге я могу получить то, что мне нужно:

head -n ` *.csv > first.txt
cat -A first.txt | tr ',' '\n' | sort | uniq

Конечно, это не рекурсивно и включает все csv файлы, а не только те, которые я хочу.

Если я сделаю следующее, я получу рекурсивный поиск, но также кучу мусора:

find . -type f -name "ABC*.csv" -o -name "XYZ*.csv" | xargs head -n 1 | tr ',' '\n' | sort | uniq

Я на Windows 10 с MinGW64. Полагаю, я мог бы использовать Python, но я чувствую себя так близко к нему!

1 Ответ

1 голос
/ 25 апреля 2019

Когда head дается несколько файлов (xargs делает это), он также печатает их имена.

Используя действие find -exec (вы должны принудительно установить приоритет -name 'ABC*.csv' -o -name 'XYZ*.csv чтобы он работал) можно получить желаемый результат.uniq здесь также не требуется, сортировка может сделать это самостоятельно.И в качестве идентификатора, вам лучше заключать буквенные строки в одинарные кавычки.

find . -type f \( -name 'ABC*.csv' -o -name 'XYZ*.csv' \) -exec head -n 1 {} \; | tr ',' '\n' | sort -u

Если ваши файлы имеют окончания строки DOS выше, команда не будет работать.В этом случае вы должны удалить возврат каретки, используя tr или sed:

find . -type f \( -name 'ABC*.csv' -o -name 'XYZ*.csv' \) -exec head -n 1 {} \; | tr -d '\r' | tr ',' '\n' | sort -u
# or
find . -type f \( -name 'ABC*.csv' -o -name 'XYZ*.csv' \) -exec head -n 1 {} \; | sed 's/\r//; s/,/\n/g' | sort -u
...