【问题标题】:How to cut range of characters from multiple columns如何从多列中剪切字符范围
【发布时间】:2012-07-03 00:02:58
【问题描述】:

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

CHROM <TAB> POS <TAB> AD0062-C <TAB> AD0063-C <TAB> AD0065-C <TAB> AD0074-C 
2L <TAB> 440 <TAB>0/1:63:60,0,249 <TAB>0/1:89:86,0,166 <TAB>1/1:96:107,24,0<TAB>1/1:49:42,6,0  
2L <TAB> 260<TAB>0/1:66:63,0,207<TAB> 1/1:99:227,111,0<TAB>1/1:99:255,144,0<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

我只想选择从第 3 列开始的前 3 个字符,以便获得如下所示的输出:

CHROM <TAB> POS <TAB> AD0062-C <TAB> AD0063-C <TAB> AD0065-C <TAB> AD0074-C 
2L <TAB> 440 <TAB> 0/1 <TAB> 0/1 <TAB> 1/1 <TAB> 1/1  
2L <TAB> 260 <TAB> 0/1 <TAB> 1/1 <TAB> 1/1 <TAB> 1/1
2L <TAB> 595 <TAB> 0/1 <TAB> 0/1 <TAB> 0/1 <TAB> 0/1

谢谢

【问题讨论】:

    标签: linux sed awk grep cut


    【解决方案1】:

    使用awk。对于除第一行之外的每一行,如果它有两个以上的字段,则获取它们的子字符串。 print 命令适用于每一行,因为它没有条件。

    awk '
        BEGIN { OFS = "\t" }
        NF > 2 && FNR > 1 { 
            for ( i=3; i<=NF; i++ ) { 
                $i = substr( $i, 1, 3 ) 
            } 
        } 
        { print }
    ' infile
    

    输出:

    CHROM   POS     AD0062-C        AD0063-C        AD0065-C        AD0074-C 
    2L      440     0/1     0/1     1/1     1/1
    2L      260     0/1     1/1     1/1     1/1
    2L      595     0/1     0/1     0/1     0/1
    

    【讨论】:

      【解决方案2】:

      使用GNU sed 的一种方式。从第二行到最后一行,将制表符之间的所有字符替换为开头的前三个字符,并在每行中多次执行但仅从第二个匹配项开始(避免前两个字段):

      sed '2,$ s/\([\t]...\)[^\t]*/\1/2g' infile
      

      输出:

      CHROM   POS     AD0062-C        AD0063-C        AD0065-C        AD0074-C 
      2L      440     0/1     0/1     1/1     1/1
      2L      260     0/1     1/1     1/1     1/1
      2L      595     0/1     0/1     0/1     0/1
      

      【讨论】:

      • 请注意,2g 按照 GNU sed(您指定)中的描述工作。在其他实现中,它是未定义的。
      【解决方案3】:

      这可能对你有用(GNU sed):

      sed '1b;s/\(\S\{3\}\)\S*/\1/2g' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-14
        • 2022-06-15
        • 2022-11-30
        • 1970-01-01
        • 2019-08-29
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        相关资源
        最近更新 更多