首页 > 解决方案 > 当第一个文件的模式出现在另一个文件中时,如何在新列中打印行号?

问题描述

如果我的信息格式不正确,我是新来的,非常抱歉。

我有几个文件,file1 仅包括参考模式,其他文件包括各种信息。我想在新列中恢复行号,其中 file1 的模式出现在其他文件中。如果可能的话,我希望相应的文件名包含在标题中。

最后,我希望从最终输出中删除所有缺少值的行。

文件1:

Entry
abc
def
ghi
jkl
mno
xyz

文件2:

line1: red|31000|ghi
line2: purple|25640|mno
line3: yellow|9560|abc
line12: blue|2630|def
line120: white|1|xyz

文件3:

line1: blue|144009|def
line2: red|100000|ghi
line3: purple|60500|mno
line52: white|2|xyz

预期的最终输出:

Entry|file2|file3
def|12|1
ghi|1|2
mno|2|3
xyz|120|52

我想有一个使用 awk 的解决方案,但我不能自己处理它(对不起)。我尝试使用 grep ,我知道它可以打印行号并比较几个文件,但这可能不是一个好的选择,因为它最初打印了第二个文件。

grep -Fnf file1 file2 > output

非常感谢您的帮助!

标签: shellawkgreptext-processing

解决方案


使用 GNU join、GNU sort、GNU awk 和 bash:

join -t '|' -j 4 <(awk 'BEGIN{FS=OFS="|"} {print NR,$0}' file2 | sort -t '|' -k4) <(awk 'BEGIN{FS=OFS="|"} {print NR,$0}' file3 | sort -t '|' -k4) -o 1.4,1.1,2.1

推荐阅读