Unix/bash:将文件名打印为日志文件中每行之前的第一个字符串



正在寻找如何将文件名附加为文件每行的第一个字符串的帮助。

只有内容的文件。我试图合并两个文件,但内容应该是第一个字符串作为文件名,然后是第1行。等等。让我们考虑两个名为FileA和FileB的文件。文件A有2行,文件B有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.

我正在努力寻找解决这个问题的办法。请帮助

使用sed替换文件每行开头的文件名:

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

对于任意数量的文件,可以在所有文件名上循环,并使用带有文件名的变量动态构造sed替换命令。

while read -r f
do
sed "s|^|$f |" "$f"
done < file.txt > merge.txt

使用awk和大括号展开。

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

文件名可以是任何东西,如果不是这样的话,只需将它们作为awk的参数

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

如果您的grep具有-H选项/标志,也可以使用grep

grep -H . fileA fileB

同样,文件名可以是任何东西。

使用tee将输出发送到stdout和合并文件。

如果您更喜欢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

最新更新