Итак, чтобы дать этому коту
из вопроса новый дом, это должно сделать:
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»).
Использование 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*
), затем выводит содержимое каждого файла, кроме первой и последней строки каждого файла. Выражение sed
1d
удаляет первую строку ввода, а $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
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
Вы можете попробовать этот 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