使用sed或awk用文本替换零

时间:2013-10-30 09:16:45

标签: sed awk

我的文本文件如下所示:

 0  chr23:54039     0   54039
 0  chr23:103278    0   103278
 0  chr22:174609    0   174609
 0  chr22:54039     0   54039
 0  chr25:103278    0   103278
 0  chr25:174609    0   174609
 26 chr26:174609    0   174609

如果第一列为'0',我需要将第一列中的0替换为chr之后的数字。因此,输出应如下所示:

23  chr23:54039     0   54039
23  chr23:103278    0   103278
22  chr22:174609    0   174609
22  chr22:54039     0   54039
25  chr25:103278    0   103278
25  chr25:174609    0   174609
26  chr26:174609    0   174609

任何人都可以提供简单的sed或awk任何linux解决方案吗?

3 个答案:

答案 0 :(得分:6)

如果第1列中的数字始终与chr数字相同,您可以使用awk

执行此操作
awk '{split($2,a,":|chr");$1=a[2]}1' file
23 chr23:54039 0 54039
23 chr23:103278 0 103278
22 chr22:174609 0 174609
22 chr22:54039 0 54039
25 chr25:103278 0 103278
25 chr25:174609 0 174609
26 chr26:174609 0 174609

答案 1 :(得分:3)

使用sed:

$ sed -r '/^0/s/0(\s*chr)([^:]*)/\2\1\2/g' file
23  chr23:54039     0   54039
23  chr23:103278    0   103278
22  chr22:174609    0   174609
22  chr22:54039     0   54039
25  chr25:103278    0   103278
25  chr25:174609    0   174609
26 chr26:174609    0   174609

没有-r

$ sed '/^0/s/0\(\s*chr\)\([^:]*\)/\2\1\2/g' file
23  chr23:54039     0   54039
23  chr23:103278    0   103278
22  chr22:174609    0   174609
22  chr22:54039     0   54039
25  chr25:103278    0   103278
25  chr25:174609    0   174609
26 chr26:174609    0   174609

想法是替换以0开头的行。在那些中,0...chrNUM:...被捕获并以所需格式打印回来。

使用awk

$ awk '/^0/ {split($2,a,":"); gsub("chr", "", a[1]); $1=a[1]}1' file
23 chr23:54039 0 54039
23 chr23:103278 0 103278
22 chr22:174609 0 174609
22 chr22:54039 0 54039
25 chr25:103278 0 103278
25 chr25:174609 0 174609
26 chr26:174609    0   174609

给定以0开头的行,第二个字段按:分隔符分成几部分,然后移除chr文本。然后它就可以存储为第一个字段。 1使条件成立,因此打印完整的新行。

答案 2 :(得分:0)

sed "s/^0[[:blank:]]\{1,\}chr\([0-9]\{1,\}\):/\1 chr\1:/"