【问题标题】:in unix :how do i print all the lines of file 1 which contain the words of file 2在 unix 中:我如何打印文件 1 中包含文件 2 的所有行
【发布时间】:2017-07-25 09:07:26
【问题描述】:

示例:

文件1:

AA123|1111|111
BB123|2222|222
CC123|3333|333
DD123|4444|444

文件2:

CC123
AA123

需要的输出:

CC123|3333|333
AA123|1111|111

【问题讨论】:

  • 这个网站上已经有无数的例子来说明如何做这种事情。
  • 请澄清您的问题。你如何定义一个单词?比赛可以在任何地方进行吗?你的管道符号有什么意义吗?

标签: linux bash shell unix


【解决方案1】:

普通的 grep 可以做到这一点:

grep -f file2 file1

我们可以更精确并添加 -F 和 -w 选项。

【讨论】:

    【解决方案2】:

    根据修改后的问题,答案可以更简单,

    $ awk -F'|' 'NR==FNR{a[$1];next} ($1 in a)' file2 file1
    AA123|1111|111
    CC123|3333|333
    

    简要说明,

    • NR==FNR{a[$1]:将$1保存在file2中作为数组的键
    • ($1 in a):如果 $1 与数组中的键匹配,则打印 file1 中的行

    【讨论】:

    • @glennjackman,感谢您的通知,我已经修改了答案。
    • @abhinavbharadwaj 如果对您有帮助,您可以检查答案是否已接受。 :)
    【解决方案3】:

    awk 脚本文件:

    FNR == 1 && FNR != NR {
                             strt=1
                          }
    strt != 1 {
                    for (i=1;i<=NF;i++) {
                                    cnt++;fnd[cnt]=$i
                                    }
              }
    strt==1 {
                    for (p=1;p<=cnt;p++) {
                                    for (i=1;i<=NF;i++) {
                                            if ($i ~ fnd[p] ) {
                                                    printf ("%s ",$i)
                                            }
                                    }
                    }
            }
    

    调用脚本文件:

    awk -f scriptfile File2 File1
    

    我们同时处理这两个文件。首先将 File2 中的数据读入一个数组,然后使用它循环 File1 中的每个字段,将匹配项打印到以空格分隔的数组 (fnd)。

    这将打印带有换行符的连续文本行(我不确定您要如何处理)

    【讨论】:

    • 谢谢你,$ awk -F'|' 'NR==FNR{a[$1];next} ($1 in a)' file2 file1 这对我来说效果最好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多