Слияние / объединение множества CSV-файлов с числовыми цифрами в имени файла
Когда мы обрабатываем наши данные CSV, мы генерируем много выходных файлов с 30 000 строк в каждом из них. Все они имеют одинаковые столбцы / поля. Все они также в формате csv, и мы помещаем их в одну папку на сервере Linux. Файлы имеют уникальное имя, используя комбинацию даты, времени и числовых цифр. Увидеть ниже.
AB_20151127_120000_0_SEGMENT_FINAL.csv
AB_20151127_120000_1_SEGMENT_FINAL.csv
AB_20151127_120000_2_SEGMENT_FINAL.csv
AB_20151127_120000_3_SEGMENT_FINAL.csv
.
.
.
AB_20151127_120000_599_SEGMENT_FINAL.csv
Теперь нам нужно объединить их в один большой файл с именем:AB_20151127_120000_SEGMENT_FINAL.csv
(обратите внимание на отсутствующие цифровые цифры в объединенном файле)
Я старался awk
как показано ниже, но это не работает. Пожалуйста, скажите мне, что я сделал не так.
awk '"AB_20151127_120000_" NR-1 "_SEGMENT_FINAL.csv"' > AB_20151127_120000_SEGMENT_FINAL.csv
2 ответа
Если порядок, в котором файлы объединяются, не важен, используйте:
cat AB_20151127_120000_*_SEGMENT_FINAL.csv > AB_20151127_120000_SEGMENT_FINAL.csv
Если порядок важен, вам придется проявить творческий подход. Если вы знаете количество сегментов, например 599, вы можете использовать расширение скобок (\
только для того, чтобы я мог напечатать команду в две строки для удобства чтения:
cat AB_20151127_120000_{0..599}_SEGMENT_FINAL.csv > \
AB_20151127_120000_SEGMENT_FINAL.csv
Если вы этого не сделаете, вы все равно можете использовать расширение скобки. Просто выберите достаточно большое число, чтобы быть уверенным, что все файлы будут включены, и игнорируйте сообщения об ошибках несуществующих файлов:
cat AB_20151127_120000_{0..599}_SEGMENT_FINAL.csv > \
AB_20151127_120000_SEGMENT_FINAL.csv 2>/dev/null
Кроме того, вы можете создать список отсортированных имен файлов и использовать это:
cat $(printf '%s\n' AB_20151127_120000_*_SEGMENT_FINAL.csv | sort -nt_ -k4) > \
AB_20151127_120000_SEGMENT_FINAL.csv
printf
напечатает каждое имя файла, за которым следует новая строка, которая передается sort
который отсортирует это численно (-n
) на 4-м поле (-t4
) где поля определяются _
(-t_
).
Если у вас есть доступ к оболочке Zsh, задача может быть сведена к одной команде:
cat AB_20151127_120000_*(n)_SEGMENT_FINAL.csv >AB_20151127_120000_SEGMENT_FINAL.csv
Это потому что (n)
преувеличивающий классификатор заставляет *
шаблон глобализации, расширяющийся до списка имен файлов, отсортированных в их естественном порядке, в отличие от их лексикографического порядка.
Для сравнения, расширение имени файла в Bash:
$ for f in *; do echo "$f"; done
AB_20151127_120000_0_SEGMENT_FINAL.csv
AB_20151127_120000_10_SEGMENT_FINAL.csv
AB_20151127_120000_1_SEGMENT_FINAL.csv
AB_20151127_120000_2_SEGMENT_FINAL.csv
AB_20151127_120000_3_SEGMENT_FINAL.csv
Расширение имени файла в Zsh с использованием (n)
классификатор:
% for f in *(n); do echo "$f"; done
AB_20151127_120000_0_SEGMENT_FINAL.csv
AB_20151127_120000_1_SEGMENT_FINAL.csv
AB_20151127_120000_2_SEGMENT_FINAL.csv
AB_20151127_120000_3_SEGMENT_FINAL.csv
AB_20151127_120000_10_SEGMENT_FINAL.csv