将文件文本与文件名合并

use*_*444 5 cat

我有两个文本文件。第一个“file1.txt”有内容:

Apple
Orange
Banana
Run Code Online (Sandbox Code Playgroud)

而第二个文件“file2.txt”有内容:

monday
tuesday
wednesday
Run Code Online (Sandbox Code Playgroud)

我想将它们组合成一个文件,其输出是:

Apple       File1.txt
Orange      File1.txt
Banana      File1.txt
monday      File2.txt
tuesday     File2.txt
wednesday   File2.txt
Run Code Online (Sandbox Code Playgroud)

cas*_*cas 14

这很简单awk

$ awk '{print $0,FILENAME}' File*.txt
Apple File1.txt
Orange File1.txt
Banana File1.txt
monday File2.txt
tuesday File2.txt
wednesday File2.txt
Run Code Online (Sandbox Code Playgroud)

如果您希望在输入行和文件名之间使用制表符而不是空格,请添加-v OFS='\t'到命令行以设置输出字段分隔符 (OFS):

awk -v OFS='\t' '{print $0,FILENAME}' File*.txt
Run Code Online (Sandbox Code Playgroud)

或使用:

awk '{print $0 "\t" FILENAME}' File*.txt
Run Code Online (Sandbox Code Playgroud)

那是假设文件名不包含=字符。如果您不能保证文件名不包含=字符,您可以将其更改为:

awk '{print $0 "\t" substr(FILENAME, 3)}' ./File*.txt
Run Code Online (Sandbox Code Playgroud)

尽管awk至少在 GNU中,如果文件的名称包含未形成有效字符的字节(您可以通过将区域设置固定为C(with LC_ALL=C awk...)来解决该问题,尽管这也会产生潜在改变的副作用),您会收到警告其他错误消息的语言(如果有)。

  • 有点烦人的是,gawk 不像大多数其他 GNU 程序那样理解 `--`,或者有一些其他方法阻止它将文件名中的 `=` 解释为 `var=value`。 (2认同)