如何从多列中剪切字符的范围

我有一个制表符分隔的文件,看起来像这样:

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 

我只想select从第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 

谢谢

使用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 

一种使用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 

这可能适用于你(GNU sed):

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