Подтвердить что ты не робот

Unix: объединить много файлов, удалив первую строку всех файлов

У меня есть > 100 файлов, которые мне нужно объединить, но для каждого файла нужно удалить первую строку. Каков наиболее эффективный способ сделать это в Unix? Я подозреваю, что это, вероятно, команда, использующая cat и sed '1d'. Все файлы имеют одинаковое расширение и находятся в одной папке, поэтому мы, вероятно, можем использовать *.extension для указания файлов. Большое спасибо!

4b9b3361

Ответ 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'