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

标签 linux sed awk grep cut

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

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

谢谢

最佳答案

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

关于linux - 如何从多列中剪切字符范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11295955/

相关文章:

linux - 如何将2个文件中的字符串合并为1个并用空格分隔?

xml - 使用 linux 实用程序从文件中提取正则表达式。在单独的行上打印每个匹配项

c - X11:如何让一个窗口一个接一个地移动?

linux - 运行 shell 脚本时定义变量?

linux - 提取部分文件名

python - 搜索基因组中不匹配的序列

linux - 查找比特定列长/短的记录

linux - 将 Samba 4.0.5 i686 交叉编译为 MIPS

linux - git pull 不应用 kubuntu/var/www/html 文件夹中的删除

perl - 如何从列表中删除可以在列表中其他较长行中找到的行?