Unix / bash: печатать имя файла как первую строку перед каждой строкой в ​​файле журнала. - PullRequest
0 голосов
/ 08 мая 2020

Нужна помощь о том, как добавить имя файла в качестве 1-й строки в каждую строку файла.

Файл, содержащий только содержимое. Я пытаюсь объединить 2 файла, но в содержимом должна быть первая строка в качестве имени файла, а затем строка 1. et c. Рассмотрим 2 файла с именами FileA и FileB. FileA имеет 2 строки, FileB - 2 строки.

FileA

Tom is Cat
Jerry is Mouse

FileB

Cat is Tom
Mouse is Jerry

Ожидаемый результат объединенного файла

FileA Tom is Cat
FileA Jerry is Mouse
FileB Cat is Tom
FileB Mouse is Jerry.

Я изо всех сил пытаюсь найти решение этой проблемы. Пожалуйста, помогите

Ответы [ 3 ]

1 голос
/ 08 мая 2020

Используйте sed для замены имени файла в начале каждой строки файла:

sed 's/^/FileA /' fileA >> mergedFile
sed 's/^/FileB /' fileB >> mergedFile

Для произвольного количества файлов вы можете oop поверх всех имен файлов и построить sed команда подстановки динамически с использованием переменной с именами файлов.

while read -r f
do
    sed "s|^|$f |" "$f"
done < file.txt > merge.txt
0 голосов
/ 09 мая 2020

Если вы предпочитаете ripgrep вместо grep, эти две команды производят одинаковый результат:

$ grep --with-filename '' File*
$ rg --with-filename --no-heading --no-line-number '' File*
FileA:Tom is Cat
FileA:Jerry is Mouse
FileB:Cat is Tom
FileB:Mouse is Jerry
0 голосов
/ 08 мая 2020

Использование awk и расширения скобок.

awk '{print FILENAME, $0}' file{A,B} | tee mergefile

имена файлов могут быть любыми, если это не то, что у вас есть, просто укажите их как аргумент с awk

awk '{print FILENAME, $0}' filefoo filebar filemore ...

Может быть выполнено с помощью grep, также если ваш grep имеет параметр / флаг -H

grep -H . fileA fileB

И снова имена файлов могут быть любыми.

Использование tee для отправки вывод в stdout и файл слияния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...