如何使用sed / awk / perl从特定列中删除n个字符

时间:2017-10-17 03:12:11

标签: linux perl unix awk sed

我有以下制表符分隔数据:

chr1    3119713 3119728 MA05911Bach1Mafk    839 +
chr1    3119716 3119731 MA05011MAFNFE2  860 +
chr1    3120036 3120051 MA01502Nfe2l2   866 +

我想要做的是从第4列删除7个字符。 导致

chr1    3119713 3119728 Bach1Mafk   839 +
chr1    3119716 3119731 MAFNFE2 860 +
chr1    3120036 3120051 Nfe2l2  866 +

我该怎么做? 请注意,输出也需要TAB分隔。

我坚持使用以下代码,这些代码从第一个代码中取代 列向前,我不想要

sed 's/^.\{7\}//' myfile.txt

3 个答案:

答案 0 :(得分:5)

 awk  '{ $4 = substr($4, 8); print }'

答案 1 :(得分:4)

perl -anE'$F[3] =~ s/.{7}//; say join "\t", @F' data.txt

perl -anE'substr $F[3],0,7,""; say join "\t", @F' data.txt

答案 2 :(得分:0)

使用sed

$ sed -E 's/^(([^\t]+\t){3}).{7}/\1/' myfile.txt
chr1    3119713 3119728 Bach1Mafk   839 +
chr1    3119716 3119731 MAFNFE2 860 +
chr1    3120036 3120051 Nfe2l2  866 +
  • -E使用扩展正则表达式,以避免对\使用(){}。某些sed版本可能需要-r而不是-E
  • ^(([^\t]+\t){3})捕获前三列,如果需要,可以轻松更改列数
  • 要从第4列中删除的
  • .{7}个字符
  • \1捕获的列
  • 使用in-place editing
  • -i选项


使用perl,您可以将\K用于可变长度正向后视

perl -pe 's/^([^\t]+\t){3}\K.{7}//' myfile.txt