【问题标题】:bash to capture specific instance of pattern and exclude othersbash 以捕获特定的模式实例并排除其他模式
【发布时间】:2018-10-11 13:22:15
【问题描述】:

我正在尝试捕获并读入 $line 中的一行或多行 file 中只有 del 的行(第 2 行是一个示例)。第 3 行有del,但它也有insbash,当当前执行时捕获两者。我不知道如何排除除del 之外的任何内容,并且只捕获这些行。谢谢你:)。

文件

NM_003924.3:c.765_779dupGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCinsGGCGGCAGC
NM_003924.3:c.765_779insGGCAGCGGCGGCAGC

期望的输出

NM_003924.3:c.765_779delGGCAGCGGCGGCAGC

带有当前输出的bash

while read line; do
  if [[ $line =~ del ]] ; then echo $line; fi
done < file

NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCinsGGCGGCAGC

【问题讨论】:

    标签: bash awk sed grep


    【解决方案1】:

    请您尝试关注(如果可以,awk)。

    awk '/del/ && !/ins/'  Input_file
    

    【讨论】:

      【解决方案2】:

      试试:

      while read -r line; do
          [[ $line =~ del && ! $line =~ ins ]] && printf '%s\n' "$line"
      done < file
      

      修改后的代码也是ShellCheck干净,避免BashPitfall #14

      如果文件中的最后一行没有终止换行符,此解决方案可能会失败。如果这是一个问题,请参阅Read last line of file in bash script when reading file line by line 接受的答案以获得修复。

      【讨论】:

        【解决方案3】:

        这是一个sed 解决方案。它否定匹配 del 后跟 ins 并打印其中包含 del 的所有内容。 -n 静默所有其他输出。

        $ sed -n -e '/del.*ins/!{/.*del.*/p}' inputFile
        NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
        

        【讨论】:

        • 谢谢大家的帮助和解释:)。
        【解决方案4】:

        这是另一个使用启用 PCRE 的答案grep。这应该与GNU grep 中的-P 选项一起使用

        $ grep -P 'del\.*(?!.*ins)' inputFile
        NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
        

        【讨论】:

        • 先有ins的记录怎么样,比如111_ins_222_del
        【解决方案5】:

        分两步。你不需要循环:

        grep "del" file | grep -v "ins"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          • 1970-01-01
          • 2019-04-16
          • 2019-07-08
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          相关资源
          最近更新 更多