我有两个文本文件。第一个“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
答案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