【问题标题】:How to grep and filter out at the same time?如何同时grep和过滤掉?
【发布时间】:2021-06-10 09:05:26
【问题描述】:

如何 grep 以数字 2 开头的行,不包括选项卡后的数字 26

file1.txt:

2    0   'C001000'
2    26 'C001000' So we come to step 3
2    0   'C001000'
2    26 'C001000' So we come to step 3


expected output 

    2    0   'C001000'
    2    0   'C001000'
   

我的方法 猫文件1.txt | grep '^2' // 抓取所有以 2 开头的行

cat file1.txt | grap '^2' $(printf '\t') '26'

【问题讨论】:

  • 添加您尝试过的内容以及给定样本所需的准确输出。我猜你只想要输出中的第 2 行和第 4 行?
  • 我希望行以 2 开头,然后是制表符,然后排除以 26 开头的数字。基本上在上表中,我想删除制表符后有 26 个数字的第二行和第四行
  • 我努力更新了

标签: shell grep


【解决方案1】:

据我所知,这应该可行:

awk -F'\t' '$1==2 && $2!=26' ip.txt

这将根据制表符处理字段。如果第一个字段是2 而第二个字段是not 26,则将打印该行。

如果您还需要打印以2 开头的行,例如2a,请使用:

awk -F'\t' '$1 ~ /^2/ && $2!=26' ip.txt

仅当第二个字段之后的字符也是制表符时,上述解决方案才有效。如果不是这种情况,那么这可能有效,但需要更好地描述输入。

awk -F'\t' '$1==2 && $2 !~ /^26([[:space:]]|$)/' ip.txt

【讨论】:

    【解决方案2】:

    使用 OP 评论中的要求:以 2 开头的行后跟制表符,然后排除以 26 开头的数字 - 和 grep:

    $ grep $'^2[\t]\(2[^6]\|[^2]\)' file
    

    使用样本数据输出:

    2       0       'C001000'
    2       0       'C001000'
    

    解释了一些:

    • grep $'\t' 此语法用于 grep for tab
    • ^2[\t] 以 2 开头的行,后跟制表符
    • \(2[^6]\|[^2]\) 然后 [我的定义* of] 不包括以26开头的数字
    • \(2[^6]\|[^2]\) 基本上以 2 开头,后跟除 6 以外的任何内容,或者以除 2 之外的任何内容开头

    【讨论】:

    • 你能解释一下你对排除 26 的定义吗?我很新,没有得到那部分
    • 添加了一个解释性项目符号。
    【解决方案3】:

    使用 GNU grep:

    grep -P '^2(?!\t26\b)' file
    

    在哪里

    • -P - 启用 PCRE 正则表达式引擎
    • ^2(?!\t26\b) - 匹配
      • ^ - 字符串开头(jhere,line)
      • 2 - 一个2
      • (?!\t26\b) - 后面不跟制表符,26 是一个完整的单词(\b 是单词边界)。您可以使用(?!\t26(?:\t|$))(?!\t26(?![^\t])) 来确保26 仅在制表符/字符串结尾之间匹配。

    查看online demo

    s="2    0   'C001000'
    2   26  'C001000'   So we come to step 3
    2   0   'C001000'
    2   26  'C001000'   So we come to step 3"
    grep -P '^2(?!\t26\b)' <<< "$s"
    

    输出:

    2   0   'C001000'
    2   0   'C001000'
    

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 2022-01-26
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多