Объединить несколько файлов, но включить имя файла в качестве заголовка раздела
Я хотел бы объединить несколько текстовых файлов в один большой файл в терминале. Я знаю, что могу сделать это, используя команду cat. Тем не менее, я хотел бы, чтобы имя файла каждого файла предшествовало "дампу данных" для этого файла. Кто-нибудь знает, как это сделать?
что у меня есть:
file1.txt = bluemoongoodbeer
file2.txt = awesomepossum
file3.txt = hownowbrowncow
cat file1.txt file2.txt file3.txt
желаемый результат:
file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow
Ответы
Ответ 1
Искал то же самое, и нашел это, чтобы предложить:
tail -n +1 file1.txt file2.txt file3.txt
Выход:
==> file1.txt <==
<contents of file1.txt>
==> file2.txt <==
<contents of file2.txt>
==> file3.txt <==
<contents of file3.txt>
Если есть только один файл, то заголовок не будет напечатан. Если вы используете утилиты GNU, вы можете использовать -v
чтобы всегда печатать заголовок.
Ответ 2
Я использовал grep для чего-то подобного:
grep "" *.txt
Он не дает вам "заголовок", но префикс каждой строки с именем файла.
Ответ 3
Это также должно сделать трюк:
find . -type f -print -exec cat {} \;
Средства:
find = linux `find` command finds filenames, see `man find` for more info
. = in current directory
-type f = only files, not directories
-print = show found file
-exec = additionally execute another linux command
cat = linux `cat` command, see `man cat`, displays file contents
{} = placeholder for the currently found filename
\; = tell `find` command that it ends now here
Далее вы можете комбинировать поиск через логические операторы, такие как -and
или -or
. find -ls
тоже приятно.
Ответ 4
Это должно сделать трюк:
for filename in file1.txt file2.txt file3.txt; do
echo "$filename"
cat "$filename"
done > output.txt
или сделать это для всех текстовых файлов рекурсивно:
find . -type f -name '*.txt' -print | while read filename; do
echo "$filename"
cat "$filename"
done > output.txt
Ответ 5
find . -type f -print0 | xargs -0 -I % sh -c 'echo %; cat %'
Это будет печатать полное имя файла (включая путь), а затем содержимое файла. Он также очень гибкий, поскольку вы можете использовать -ex "expr" для команды find и запускать столько команд, сколько хотите в файлах.
Ответ 6
У меня была серия файлов, которые закончились в файле stats.txt, который я хотел объединить с именами файлов.
Я сделал следующее, и когда имеется более одного файла, команда "больше" включает имя файла в качестве заголовка.
more *stats.txt > stats.txt
или для общего случая
more FILES_TO_CONCAT > OUTPUT_FILE
Ответ 7
Вот как я обычно обрабатываю форматирование следующим образом:
for i in *; do echo "$i"; echo ; cat "$i"; echo ; done ;
Я вообще передаю кошку в grep для конкретной информации.
Ответ 8
Мне нравится эта опция
for x in $(ls ./*.php); do echo $x; cat $x | grep -i 'menuItem'; done
Результат выглядит следующим образом:
./debug-things.php
./Facebook.Pixel.Code.php
./footer.trusted.seller.items.php
./GoogleAnalytics.php
./JivositeCode.php
./Live-Messenger.php
./mPopex.php
./NOTIFICATIONS-box.php
./reviewPopUp_Frame.php
$('#top-nav-scroller-pos-<?=$active**MenuItem**;?>').addClass('active');
gotTo**MenuItem**();
./Reviews-Frames-PopUps.php
./social.media.login.btns.php
./social-side-bar.php
./staticWalletsAlerst.php
./tmp-fix.php
./top-nav-scroller.php
$active**MenuItem** = '0';
$active**MenuItem** = '1';
$active**MenuItem** = '2';
$active**MenuItem** = '3';
./Waiting-Overlay.php
./Yandex.Metrika.php
Ответ 9
вы можете использовать эту простую команду вместо использования цикла for,
ls -ltr | awk '{print $9}' | xargs head
Ответ 10
Вот простой способ. Вы сказали, что хотите кошку, что означает, что вы хотите просмотреть весь файл. Но вам также нужно напечатать имя файла.
Попробуйте это
head -n99999999 *
или head -n99999999 file1.txt file2.txt file3.txt
Надеюсь, что поможет
Ответ 11
Если вам нравятся цвета, попробуйте следующее:
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 *
Ответ 12
Этот метод будет печатать имя файла, а затем содержимое файла:
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 ...
Ответ 13
Если вы хотите заменить эти уродливые ==> <== на что-то еще
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"
- вывести все в файл
Ответ 14
find . -type f -exec cat {} \; -print
Ответ 15
Если вы хотите, чтобы результат был в том же формате, что и ваш желаемый результат, вы можете попробовать:
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
Ответ 16
... приглядываясь к тем, кто уже упомянул head, для некоторых из нас:
$ r head
head file*.txt
==> file1.txt <==
xxx
111
==> file2.txt <==
yyy
222
nyuk nyuk nyuk
==> file3.txt <==
zzz
$
Мне нужно прочитать первую строку; как отмечено, если вы хотите более 10 строк, вам придется добавлять опции (head -9999 и т.д.).
Извините за публикацию производного комментария; У меня нет достаточного количества уличного кредитора для комментария/добавления к комментирующему комментарию.
Ответ 17
Для решения этой задачи я обычно использую следующую команду:
$ cat file{1..3}.txt >> result.txt
Это очень удобный способ объединения файлов, если количество файлов достаточно велико.
Ответ 18
Если все файлы имеют одинаковые имена или могут быть сопоставлены с помощью find
, вы можете сделать (например):
find . -name create.sh | xargs tail -n +1
найти, показать путь и кошку каждого файла.
Ответ 19
И недостающее решение awk:
$ awk '(FNR==1){print ">> " FILENAME " <<"}1' *