我有一个制表符分隔文件,如下所示:
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
由于
答案 0 :(得分:2)
使用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
答案 1 :(得分:0)
使用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
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed '1b;s/\(\S\{3\}\)\S*/\1/2g' file