将文件文本与文件名合并

将文件文本与文件名合并

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

Apple
Orange
Banana

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

monday
tuesday
wednesday

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

Apple       File1.txt
Orange      File1.txt
Banana      File1.txt
monday      File2.txt
tuesday     File2.txt
wednesday   File2.txt

答案1

这是相当微不足道的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

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

awk -v OFS='\t' '{print $0,FILENAME}' File*.txt

或使用:

awk '{print $0 "\t" FILENAME}' File*.txt

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

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

尽管至少在 GNU 中awk,如果文件名包含不形成有效字符的字节,您会收到警告(您可以通过将语言环境修复为C(with LC_ALL=C awk...) 来解决此问题,尽管这也会产生潜在更改其他错误消息的语言(如果有)。

答案2

perl

perl -lpe '$_ .= "\t$ARGV"' File*.txt

File*.txt(请注意,使用像but 这样的glob 就可以了不同的可能会很危险)。

答案3

对于命令行上的交互式使用,最简单的输入之一是

grep . File*.txt

由于正则表达式.匹配任何字符,因此每个文件的每个非空行都会匹配,并以文件名作为前缀打印。

它非常适合检查某些内核设置(每个文件存储一个设置)等用例:

$ grep . /sys/kernel/mm/transparent_hugepage/*
/sys/kernel/mm/transparent_hugepage/defrag:[always] defer defer+madvise madvise never
/sys/kernel/mm/transparent_hugepage/enabled:[always] madvise never
/sys/kernel/mm/transparent_hugepage/hpage_pmd_size:2097152
grep: /sys/kernel/mm/transparent_hugepage/khugepaged: Is a directory
/sys/kernel/mm/transparent_hugepage/shmem_enabled:always [within_size] advise never deny force
/sys/kernel/mm/transparent_hugepage/use_zero_page:1

相关内容