【问题标题】:match lines where a specified column range does not contain the dot character匹配指定列范围不包含点字符的行
【发布时间】:2012-06-28 15:50:43
【问题描述】:

我有一个制表符分隔的文件,如下所示:

2L <TAB> 440 <TAB> . <TAB> . <TAB> . <TAB> 1/1:49:42,6,0  
2L <TAB> 260 <TAB> 0/1:66:63,0,207 <TAB> . <TAB> . <TAB> 1/1:49:42,6,0
2L <TAB> 595 <TAB> 0/1:11:85,0,8 <TAB>0/1:13:132,0,10 <TAB>0/1:73:70,0,131<TAB> 0/1:59:72,0,56

在这个例子中,我只包含了 6 列,但实际文件本身总共包含 19 列。如何使用 awk 提取行,以便从第 3 列开始的每一列都包含点 (.) 字符以外的内容?从上面的例子中,我想输出第 3 行,因为所有 6 列都不为空,并且没有点字符作为它们的值。

我已经尝试了几个命令,例如下面的命令,但它似乎不起作用。

awk '$3-$19==0-9' input.txt > out.txt

提前致谢

【问题讨论】:

    标签: regex linux awk


    【解决方案1】:

    awk:

    awk -F'\t' '{ for(i=3;i<=NF;i++)if($i ==".") next; print}' input.txt > out.txt
    

    awk -F'\t' '!/\t\.\t/' input.txt > out.txt
    

    sed:

    sed '/\t\.\t/d' input.txt > out.txt 
    

    【讨论】:

      【解决方案2】:

      不确定有什么方法可以更优雅地做到这一点,但这应该可以:

      awk '$3$4$5$6$7$8$9$10$11$12$13$14$15$16$17$18$19 !~ /\./ {print}'
      

      这基本上连接了所有相关字段并搜索 .在结果中,并且仅在不匹配时打印。

      【讨论】:

        【解决方案3】:

        sed 的变体:

        sed '/\([^\t]*\t\)\{2\}.*\t\.\t/d' input.txt > out.txt
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-25
          • 2010-11-22
          • 1970-01-01
          • 1970-01-01
          • 2012-07-24
          • 2022-11-19
          相关资源
          最近更新 更多