【问题标题】:How to print line number in new column when patterns from first file occur in another file?当第一个文件的模式出现在另一个文件中时,如何在新列中打印行号?
【发布时间】:2020-01-17 13:14:45
【问题描述】:

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

我有几个文件,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

非常感谢您的帮助!

【问题讨论】:

  • 好的,谢谢您的评论。有没有简单的方法来编辑我的帖子?再次抱歉,我是新来的,还不熟悉论坛的实际用法。
  • 在您的用户ID左侧,您可以看到“分享”、“编辑”和“标记”的链接。点击“编辑”
  • 我觉得 grep 不可行。尝试为此目的编写一个 python/perl/awk 脚本。
  • @serpantinAL 更好,但是您在输入文件中显示的line12: 等值是否真的存在于这些文件中,或者您是否试图告诉我们文本的其余部分存在于第 12 行?如果是前者,那很好,如果是后者,那么修复它,以便您问题中的输入文件准确且仅显示您的实际输入。再次 - 我们需要您提供我们可以复制/粘贴以进行测试的输入文件。您必须提供输入文件供我们测试,或者每个阅读您的问题的人都必须创建自己的输入文件进行测试。猜猜哪种方法会产生最多/最好的答案!
  • 另外,包括 abc 等出现在 file2 和 file3 的第一列以及 abcdef 出现在第三列的情况,因此我们可以查看您是否要在任何地方进行匹配在线上,仅在 1 列中,仅在完整字段或部分字段中,等等。此外,如果您的文件可以包含正则表达式元字符,则在您的示例中包括对这些元字符的处理。

标签: shell awk grep text-processing


【解决方案1】:

使用 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

【讨论】:

  • 太棒了!非常感谢,这是我所期望的。我的输入有点不同,但我能够用这段代码完美地管理!再次感谢@Cyrus!
  • 只是一个附加问题。如果我有超过 2 个文件怎么办?
  • 从我的角度来看,这不适用于连接和没有循环。然后是时候编写一个纯 awk 程序了。
猜你喜欢
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2011-08-14
  • 2016-10-15
  • 2014-09-10
  • 2015-12-25
  • 1970-01-01
  • 2017-09-18
相关资源
最近更新 更多