У меня есть > 100 файлов, которые мне нужно объединить, но для каждого файла нужно удалить первую строку. Каков наиболее эффективный способ сделать это в Unix? Я подозреваю, что это, вероятно, команда, использующая cat и sed '1d'. Все файлы имеют одинаковое расширение и находятся в одной папке, поэтому мы, вероятно, можем использовать *.extension для указания файлов. Большое спасибо!
Unix: объединить много файлов, удалив первую строку всех файлов
Ответ 1
Предполагая, что ваши имена файлов отсортированы в том порядке, в котором вы хотите добавить ваши файлы, вы можете использовать:
ls *.extension | xargs -n 1 tail -n +2
EDIT: После того, как Сорин и Жиль комментируют возможные опасности выхода ls трубопровода, вы можете использовать:
find . -name "*.extension" | xargs -n 1 tail -n +2
Ответ 2
Каждый должен быть сложным. Это очень просто:
tail -q -n +2 file1 file2 file3
И так далее. Если у вас есть большое количество файлов, вы можете сначала загрузить их в массив:
list=(file1 file2 file3)
tail -q -n +2 "${list[@]}"
Все файлы с заданным расширением в текущем каталоге?
list=(*.extension)
tail -q -n +2 "${list[@]}"
Или просто
tail -q -n +2 *.extension
Ответ 3
Просто добавьте каждый файл после удаления первой строки.
#!/bin/bash
DEST=/tmp/out
FILES=space separated list of files
echo "" >$DEST
for FILE in $FILES
do
sed -e'1d' $FILE >>$DEST
done
Ответ 4
tail
выводит последние строки файла. Вы можете сказать, сколько строк напечатано или сколько строк пропустить в начале (-n +N
где N - номер первой строки для печати, считая от 1 - так +2
опускает одну строку). С утилитами GNU (например, под Linux или Cygwin), FreeBSD или другими системами, у которых есть опция -q
:
tail -q -n +2 *.extension
tail
печатает заголовок перед каждым файлом, а -q
не является стандартным. Если ваша реализация не имеет его или переносится, вам нужно перебирать файлы.
for x in *.extension; do tail -n +2 <"$x"; done
Кроме того, вы можете вызвать Awk, который имеет способ идентифицировать первую строку каждого файла. Скорее всего, это будет быстрее, если у вас много мелких файлов и медленнее, если у вас много больших файлов.
awk 'FNR != 1' *.extension
Ответ 5
ls -1 file*.txt | xargs nawk 'FNR!=1'