【问题标题】:grep: Keeping lines that has specific string in certain columngrep:保留特定列中具有特定字符串的行
【发布时间】:2018-08-03 01:17:24
【问题描述】:

我正在尝试在特定列中挑选出具有特定值的行并将其保存到输出中。我正在尝试用 grep 来做到这一点。可能吗?

我的数据是这样的:

apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf
melon   1   ewtedf   wersdf
orange  3   qqqwetr  hredfg

我想挑出第二列值为 5 的行并将其保存到新的输出文件中。

apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf

非常感谢您的帮助!

【问题讨论】:

    标签: awk sed grep


    【解决方案1】:

    grep 可能是可能的,但执行此操作的适当工具绝对是awk。您可以使用

    过滤第二列中包含 5 的每一行
    awk '$2 == 5'
    

    说明

    awk 将其输入拆分为记录(通常是一行)和字段(通常是一列),并对符合特定条件的记录执行操作。这里

    awk '$2 == 5'
    

    的简写形式
    awk '$2 == 5 {print($0)}'
    

    翻译成

    For each record, if the second field ($2) is 5, print the full record ($0).
    

    变化

    如果您需要动态选择用于过滤值的键值,请使用awk-v 选项:

    awk -v "key=5" '$2 == key {print($0)}'
    

    如果您需要保留文件的第一行,因为它包含表的标题,请使用 NR 变量来跟踪当前记录的序号:

    awk 'NR == 1 || $2 == 5'
    

    字段分隔符是一个正则表达式,用于定义哪些文本分隔列,可以使用-F 字段进行修改。例如,如果您的数据位于基本 CSV 文件中,则过滤器将是

    awk -F", *" '$2 == 5'
    

    访问 标签 wiki 找到一些有用的信息来开始学习 awk

    【讨论】:

    • 如果输入表有标题行,我们如何保留它?
    【解决方案2】:

    要在第二个字段为 5 时打印,请使用:awk '$2==5' file

    【讨论】:

      【解决方案3】:

      试试这个:

      grep '^[^\s]\+\s5.*$' file.txt
      

      该模式查找行首,后跟多个非空格字符,然后是空格,然后是 5,然后是任意数量的字符,然后是 eol。

      【讨论】:

      • .*$ 部分没用。
      • 你永远不会想到西班牙宗教裁判所! ☺
      【解决方案4】:

      你可以得到以下命令。

      $ cat data.txt
      apple   5   abcdefd  ewdsf
      peach   5   ewtdsfe  wtesdf
      melon   1   ewtedf   wersdf
      orange  3   qqqwetr  hredfg
      grape   55  kkkkkkk  aaaaaa
      
      $ grep -E '[^ ]+ +5 .*' data.txt > output.txt
      
      $ cat output.txt
      apple   5   abcdefd  ewdsf
      peach   5   ewtdsfe  wtesdf
      

      您只能通过grep 命令获得答案。 但我强烈建议你使用awk 命令。

      【讨论】:

        【解决方案5】:

        简单的方法是:

        grep '5' MyDataFile
        

        结果:

        apple   5   abcdefd  ewdsf
        peach   5   ewtdsfe  wtesdf
        

        要在新文件中捕获它:

        grep '5' MyDataFile > newfile
        

        注意:会在 MyDataFile 的任何地方找到 5。为了限制到第二列,一个简短的脚本将满足您的需求。如果您只想将其限制在第二列,则可以使用如下所示的快速脚本。用法:script number datafile

        #!/bin/bash
        
        while read -r fruit num stuff || [ -n "$stuff" ]; do
            [ "$num" -eq "$1" ] && printf "%s  %s  %s\n" "$fruit" "$num" "$stuff"
        done <"$2"
        

        输出:

        $ ./fruit.sh 5 dat/mydata.dat
        
        apple  5  abcdefd  ewdsf
        peach  5  ewtdsfe  wtesdf
        

        【讨论】:

        • 我希望将其限制在第二列。抱歉,我发布的示例很糟糕。其他列有数值。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-27
        • 2017-09-20
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多