Объединить несколько файлов, но включить имя файла в качестве заголовка раздела - PullRequest
310 голосов
/ 07 мая 2011

Я хотел бы объединить несколько текстовых файлов в один большой файл в терминале. Я знаю, что могу сделать это с помощью команды cat. Однако я хотел бы, чтобы имя файла каждого файла предшествовало «дампу данных» для этого файла. Кто-нибудь знает, как это сделать?

что у меня сейчас есть:

file1.txt = bluemoongoodbeer

file2.txt = awesomepossum

file3.txt = hownowbrowncow

cat file1.txt file2.txt file3.txt

желаемый вывод:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow

Ответы [ 19 ]

2 голосов
/ 26 августа 2016

Если вам нравятся цвета, попробуйте это:

for i in *; do echo; echo $'\e[33;1m'$i$'\e[0m'; cat $i; done | less -R

или:

tail -n +1 * | grep -e $ -e '==.*'

или: (с установленным пакетом 'multitail')

multitail *
1 голос
/ 13 апреля 2015

Этот метод напечатает имя файла, а затем содержимое файла:

tail -f file1.txt file2.txt

Выход:

==> file1.txt <==
contents of file1.txt ...
contents of file1.txt ...

==> file2.txt <==
contents of file2.txt ...
contents of file2.txt ...
1 голос
/ 04 октября 2018

Если вы хотите заменить эти уродливые ==> <== чем-то другим </p>

tail -n +1 *.txt | sed -e 's/==>/\n###/g' -e 's/<==/###/g' >> "files.txt"

объяснение:

tail -n +1 *.txt - вывести все файлы в папке с заголовком

sed -e 's/==>/\n###/g' -e 's/<==/###/g' - заменить ==> на новую строку + ### и <== просто ###

>> "files.txt" - выводвсе в файл

0 голосов
/ 24 мая 2019

И недостающее решение awk:

$ awk '(FNR==1){print ">> " FILENAME " <<"}1' *
0 голосов
/ 16 апреля 2019

Если все файлы имеют одинаковые имена или могут совпадать с find, вы можете сделать (например,):

find . -name create.sh | xargs tail -n +1

чтобы найти, показать путь и кошку каждого файла.

0 голосов
/ 15 апреля 2018

Для решения этой задачи я обычно использую следующую команду:

$ cat file{1..3}.txt >> result.txt

Это очень удобный способ объединения файлов, если число файлов достаточно большое.

0 голосов
/ 17 декабря 2015
find . -type f -exec cat {} \; -print
0 голосов
/ 01 февраля 2016

Если вы хотите, чтобы результат был в том же формате, что и желаемый результат, вы можете попробовать:

for file in `ls file{1..3}.txt`; \
do echo $file | cut -d '.' -f 1; \ 
cat $file  ; done;

Результат:

file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow

Вы можете поставить echo -e до и после разреза, чтобы у вас также был интервал между строками:

$ for file in `ls file{1..3}.txt`; do echo $file | cut -d '.' -f 1; echo -e; cat $file; echo -e  ; done;

Результат:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow
0 голосов
/ 21 марта 2016
  • AIX 7.1 ksh

... бросается в глаза тем, кто уже упомянул head , работает для некоторых из нас:

$ r head
head file*.txt
==> file1.txt <==
xxx
111

==> file2.txt <==
yyy
222
nyuk nyuk nyuk

==> file3.txt <==
zzz
$

Мне нужно прочитать первую строку; как уже отмечалось, если вам нужно более 10 строк, вам нужно будет добавить опции (head -9999 и т. д.).

Извините за публикацию производного комментария; У меня нет достаточного количества уличных кредитов, чтобы комментировать / добавлять чьи-либо комментарии.

...