在第n次提到bash中的一个字符后删除所有内容

时间:2016-09-13 17:58:47

标签: bash command-line sed text-files

我有一个制表符分隔的文本文件:

ASSI-3_2    scaf0270669_20068.102_wgs
ASSI-4_3    scaf0189112_70083.538_rad
ASSI-5_4    scaf0083789_70072.963_wgs
ASSI-8_7    scaf0423760_50193.589_dart
ASSI-11_10  scaf0285971_60192.428_wgs
ASSI-12_11  scaf0409557_70062.641_wgs
ASSI-13_12  scaf0430981

我希望摆脱第3个'_'字符后的所有内容:

ASSI-3_2    scaf0270669_20068.102
ASSI-4_3    scaf0189112_70083.538
ASSI-5_4    scaf0083789_70072.963
ASSI-8_7    scaf0423760_50193.589
ASSI-11_10  scaf0285971_60192.428
ASSI-12_11  scaf0409557_70062.641
ASSI-13_12  scaf0430981

我这样做的方法是用@替换第三个下划线然后删除@之后的所有内容:

sed -r 's/_/@/3' | sed -r 's/@.*//'

我可以使用bash中的命令,这样我可以一次性执行此操作吗?

我试了这个没有运气:

sed -r 's/_.*//3'

4 个答案:

答案 0 :(得分:2)

使用cut即可:

cut -d_ -f1-3 file

ASSI-3_2    scaf0270669_20068.102
ASSI-4_3    scaf0189112_70083.538
ASSI-5_4    scaf0083789_70072.963
ASSI-8_7    scaf0423760_50193.589
ASSI-11_10  scaf0285971_60192.428
ASSI-12_11  scaf0409557_70062.641
ASSI-13_12  scaf0430981

或使用awk

awk -F_ 'NF>3{$0=$1 FS $2 FS $3} 1' file

ASSI-3_2    scaf0270669_20068.102
ASSI-4_3    scaf0189112_70083.538
ASSI-5_4    scaf0083789_70072.963
ASSI-8_7    scaf0423760_50193.589
ASSI-11_10  scaf0285971_60192.428
ASSI-12_11  scaf0409557_70062.641
ASSI-13_12  scaf0430981

答案 1 :(得分:0)

这个怎么样:

sed -e 's/_[^_\t]\+$//'

这与您尝试的解决方案类似,只是我将.替换为[^_\t],我添加了$。这保证了我们将捕获_的最后一个实例。

答案 2 :(得分:0)

        Let's try this one:

awk -F_ 'NF>2{sub(FS $NF,"")}1' file

ASSI-3_2    scaf0270669_20068.102
ASSI-4_3    scaf0189112_70083.538
ASSI-5_4    scaf0083789_70072.963
ASSI-8_7    scaf0423760_50193.589
ASSI-11_10  scaf0285971_60192.428
ASSI-12_11  scaf0409557_70062.641
ASSI-13_12  scaf0430981

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed 's/^\(.*_.*_.*\)_.*/\1/' file

模式匹配并从第三个_开始删除所有内容。