1

我有如下所示的文本文件:

 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 解决方案吗?

4

3 回答 3

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
于 2013-10-30T09:41:57.777 回答
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使条件为真,因此打印完整的新行。

于 2013-10-30T09:25:16.130 回答
0
sed "s/^0[[:blank:]]\{1,\}chr\([0-9]\{1,\}\):/\1 chr\1:/"
于 2013-10-30T12:35:17.733 回答