我有一个制表符分隔的文本文件:
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'
答案 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
模式匹配并从第三个_
开始删除所有内容。