Команда Sed для объединения нескольких файлов

Итак, чтобы дать этому коту из вопроса новый дом, это должно сделать:

find . -type f -exec cat {} + | wc -l

Он выполняет кот с максимально допустимым количеством имен файлов ( + ) снова и снова и направляет все в wc . Если вы не хотите перемещаться по подкаталогам, необходимо добавить -maxdepth 1 к команде find после каталога.

В качестве альтернативы можно использовать параметр - files0-from для GNU wc :

find . -type f -print0 | wc -l --files0-from=- | tail -1

Этот параметр заставляет wc не читать содержимое но имена файлов из стандартного ввода, разделенные нулевыми символами. С -print0 , find будет печатать эти имена файлов, разделенные нулевым байтом. Поскольку wc по-прежнему будет выводить количество строк для каждого файла, рекомендуется пропустить все, кроме итоговой строки в конце, отсюда и хвост .

Оба решения имеют то преимущество, что они будут работать в любой локали, тогда как решения @cas необходимо адаптировать (например, «total» на немецком языке означает «insgesamt»).

1
27.03.2019, 16:07
3 ответа

Использование head, tailиsed:

set -- File*

{
    head -n 1 "$1"
    for file do
        sed '1d;$d' "$file"
    done
    tail -n 1 "$file"
} >outfile

Это предполагает, что все соответствующие имена файлов соответствуютFile*(или любому шаблону, который вы используете для их сопоставления в команде set).

Команда setустанавливает позиционные параметры, то есть $1, $2и т. д., в имена файлов, с которыми мы хотели бы работать. Они также доступны в списке $@.

Команда headначинается с извлечения заголовка из первого файла.

Следующая команда sedв цикле (, которая перебирает все файлы, соответствующие File*), затем выводит содержимое каждого файла, кроме первой и последней строки каждого файла. Выражение sed1dудаляет первую строку ввода, а $dудаляет последнюю строку.

Окончательный tailвыводит нижний колонтитул из последнего файла.

Весь вывод перенаправляется в файл с именем outfile.

Тестирование с четырьмя файлами, каждый с однострочным заголовком и нижним колонтитулом:

$ cat File*
FIRST HEADER
1
2
3
FOOTER
HEADER
1
2
3
FOOTER
HEADER
1
2
3
FOOTER
HEADER
1
2
3
LAST FOOTER

Запуск команд сверху. А потом,

$ cat outfile
FIRST HEADER
1
2
3
1
2
3
1
2
3
1
2
3
LAST FOOTER
3
27.01.2020, 23:22
Kindly try with below steps and it worked fine

step1:

for i in file1 file2.........filen; do sed -i -e '1d' -e '$d' $i;cat $i >>final_file; done

step2

sed -i '1i Name' final_file

step3

sed '$s/.*/&\nNext date/g' final_file
0
27.01.2020, 23:22

Вы можете попробовать этот awk:

cat script_awk 
NR == 1 {
# keep first header in a
  a = $0
  next
}
FNR == 1 {
# remove last line of File_n and header of File_n+1 
  a=""
  next
}
{
if ( a )
# print previous line
  print a
# keep last line in a
  a=$0
}
END {
# print the last line (footer of last File)
  print a
}

и назовите это так:

awk -f script_awk File1 File2 File10

Можно так назвать:

awk -f script_awk File*

, но не уверен, что получил нижний колонтитул File10

0
27.01.2020, 23:22

Теги

Похожие вопросы