删除特定列

时间:2018-04-05 21:19:10

标签: regex awk sed

我有一个示例文本文件,其中包含以下列

scff2  54   92   aa_bb_c4_1024_0_2 scff2   30  18   aa_bb_c4_1024_0_2
scff8  80   96   aa_bb_c4_24_0_2   scff8   14  42   aa_bb_c4_24_0_2
scff1  20   25   aa_bb_c4_98_0_1   scff4   11  25   aa_bb_c4_13_0_1
scff6  16   61   aa_bb_c4_84_0_1   scff6   15  16   aa_bb_c4_84_0_2

我想删除第4列和第8列中的最后一个字符,如下所示,使用awk

scff2  54   92   aa_bb_c4_1024_0 scff2   30  18   aa_bb_c4_1024_0
scff8  80   96   aa_bb_c4_24_0   scff8   14  42   aa_bb_c4_24_0
scff1  20   25   aa_bb_c4_98_0   scff4   11  25   aa_bb_c4_13_0
scff6  16   61   aa_bb_c4_84_0   scff6   15  16   aa_bb_c4_84_0

我尝试使用以下脚本sed -i.bak 's/_[0-9]*$//' sample.txt,但它确实删除了第8列中最后一个下划线后的字符,但没有删除第4列中的字符。有人可以指导我实现我想要的输出。提前谢谢。

5 个答案:

答案 0 :(得分:3)

您可以使用sub()中的awk在特定字段中执行替换。

awk '{sub(/_[0-9]*$/, "", $4); sub(/_[0-9]*$/, "", $8); print}' sample.txt

答案 1 :(得分:3)

看起来你只需要:

$ sed 's/_[0-9]\( \|$\)/\1/g' file
scff2  54   92   aa_bb_c4_1024_0 scff2   30  18   aa_bb_c4_1024_0
scff8  80   96   aa_bb_c4_24_0   scff8   14  42   aa_bb_c4_24_0
scff1  20   25   aa_bb_c4_98_0   scff4   11  25   aa_bb_c4_13_0
scff6  16   61   aa_bb_c4_84_0   scff6   15  16   aa_bb_c4_84_0

或者如果您的sed支持-E来启用ERE(我希望您使用-i后会这样做):

$ sed -E 's/_[0-9]( |$)/\1/g' file
scff2  54   92   aa_bb_c4_1024_0 scff2   30  18   aa_bb_c4_1024_0
scff8  80   96   aa_bb_c4_24_0   scff8   14  42   aa_bb_c4_24_0
scff1  20   25   aa_bb_c4_98_0   scff4   11  25   aa_bb_c4_13_0
scff6  16   61   aa_bb_c4_84_0   scff6   15  16   aa_bb_c4_84_0

或@GlennJackman在评论中指出,使用GNU sed(以上也适用于其他seds,例如OSX sed),它是:

sed 's/_[0-9]\>//g'

答案 2 :(得分:2)

有时在中存储替换结果很有用:

$ awk '{$4=gensub(/_[0-9]$/, "", 1, $4); $8=gensub(/_[0-9]$/, "", 1, $8)}1' file

输出:

scff2 54 92 aa_bb_c4_1024_0 scff2 30 18 aa_bb_c4_1024_0
scff8 80 96 aa_bb_c4_24_0 scff8 14 42 aa_bb_c4_24_0
scff1 20 25 aa_bb_c4_98_0 scff4 11 25 aa_bb_c4_13_0
scff6 16 61 aa_bb_c4_84_0 scff6 15 16 aa_bb_c4_84_0

但@Barmar解决方案更聪明/更短/更轻

不是在所有awk实施中:不是nawk,需要GNU awk或者mawks

答案 3 :(得分:0)

在GNU awk中,所有内容都以`_ [0-9] +'结尾删除:

$ awk '{gsub(/_[0-9]+\>/,"")}1' file
scff2  54   92   aa_bb_c4_1024_0 scff2   30  18   aa_bb_c4_1024_0
scff8  80   96   aa_bb_c4_24_0   scff8   14  42   aa_bb_c4_24_0
...

答案 4 :(得分:0)

awk '{gsub(/_0_./,"_0")}1' file

scff2  54   92   aa_bb_c4_1024_0 scff2   30  18   aa_bb_c4_1024_0
scff8  80   96   aa_bb_c4_24_0   scff8   14  42   aa_bb_c4_24_0
scff1  20   25   aa_bb_c4_98_0   scff4   11  25   aa_bb_c4_13_0
scff6  16   61   aa_bb_c4_84_0   scff6   15  16   aa_bb_c4_84_0
相关问题