【问题标题】:grep "output of cat command - every line" in a different filegrep“cat 命令的输出 - 每一行”在不同的文件中
【发布时间】:2012-12-25 11:01:08
【问题描述】:

对不起,这个问题的标题有点令人困惑,但我想不出其他任何东西。 我正在尝试做这样的事情

cat fileA.txt | grep `awk '{print $1}'` fileB.txt

fileA 包含 100 行,而 fileB 包含 1 亿行。

我想要的是从fileA中获取id,在不同的file-fileB中grep该id并打印该行。

e.g fileA.txt
1234
1233

e.g.fileB.txt
1234|asdf|2012-12-12
5555|asdd|2012-11-12
1233|fvdf|2012-12-11

预期输出是

1234|asdf|2012-12-12
1233|fvdf|2012-12-11

【问题讨论】:

    标签: shell grep cat


    【解决方案1】:

    完全摆脱catawk

    grep -f fileA.txt fileB.txt
    

    【讨论】:

      【解决方案2】:

      单独的 awk 可以很好地完成这项工作:

      awk -F'|' 'NR==FNR{a[$0];next;}$1 in a' fileA fileB
      

      看测试:

      kent$  head a b
      ==> a <==
      1234
      1233
      
      ==> b <==
      1234|asdf|2012-12-12
      5555|asdd|2012-11-12
      1233|fvdf|2012-12-11
      
      kent$  awk -F'|' 'NR==FNR{a[$0];next;}$1 in a' a b
      1234|asdf|2012-12-12
      1233|fvdf|2012-12-11
      

      编辑

      添加说明:

      -F'|'  #| as field separator (fileA)
      'NR==FNR{a[$0];next;} #save lines in fileA in array a
       $1 in a  #if $1(the 1st field) in fileB in array a, print the current line from FileB
      

      关于更多细节,我无法在这里解释,抱歉。例如 awk 如何处理两个文件,什么是 NR,什么是 FNR.. 我建议尝试这条 awk 行,以防接受的答案对您不起作用。如果您想更深入地挖掘,请阅读一些 awk 教程。

      【讨论】:

      • +1 这应该是公认的答案,因为grep -f 会无意中匹配123411234 等内容。
      • @Kent 你介意解释一下'NR==FNR{a[$0];next;}$1 in a'
      • 我想弄清楚是否要在特定列中执行 grep... grep -f 不起作用。
      • @priyank 添加了简短说明。
      【解决方案3】:

      如果 id 位于不同的行上,您可以使用 grep 中的 -f 选项,如下所示:

      cut -d "|" -f1 < fileB.txt | grep -F -f fileA.txt
      

      cut 命令将确保在使用grep 的模式搜索中只搜索第一个字段。

      来自手册页:

      -f FILE, --file=FILE
      Obtain patterns from FILE, one per line.  
      The empty file contains zero patterns, and therefore matches nothing.
      (-f is specified by POSIX.)
      

      【讨论】:

      • @Kent 我想我们也必须使用cut
      • 我认为你的 grep 也需要 -F 。您不希望 fileA 中的行成为正则表达式模式吗?
      • @Kent Aw,很好。或者使用fgrep,但这不可用。
      • OP 已接受答案。如果他没有回来寻求更好的解决方案,那么 grep 将使用他的“1 亿行”fileB。祝他好运..
      • 又是-1,抱歉,刚刚发现您的命令不起作用。因为切割线(管道之前)没有输入文件。 :) 我认为文件是fileB,那么输出只是第一列,而不是整行。另外,如果 fileB 很大,您进行了两次昂贵的处理,这可能会很慢......
      猜你喜欢
      • 2013-11-09
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 2012-07-31
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      相关资源
      最近更新 更多