使用sed或awk将零替换为文本

使用sed或awk将零替换为文本,sed,awk,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  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解决方案吗?

使用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使条件为真,因此打印完整的新行。

使用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
使条件为真,因此打印完整的新行。

如果第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列中的数字始终与
chr
number相同,则可以使用
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

@现实精神检查一切versions@realspirituals请注意,OP输入在每行之前都有一个空格。我在测试中删除了它,因为我想这是一个错误。删除了前面的WS之后,这三个都可以正常工作。谢谢,伙计。@OlivierDulac,谢谢。请注意,添加空格
/^0/
不是最终解决方案,因为它可能有一个选项卡而不是空格
/^0/FS
会更好,在
开始{}
组中,将设置字段分隔符。@fedorqui:或者简单地说:
($1==“0”)
?@realspirituals全部选中versions@realspirituals请注意,OP输入在每行之前都有一个空格。我在测试中删除了它,因为我想这是一个错误。删除了前面的WS之后,这三个都可以正常工作。谢谢,伙计。@OlivierDulac,谢谢。请注意,添加空格
/^0/
不是最终解决方案,因为它可能有一个选项卡而不是空格
/^0/FS
会更好,在
BEGIN{}
组中,将设置字段分隔符。@fedorqui:或者简单地说:
($1==“0”)
?@Jotne:+1以获得关于awk用法的优雅和洞察力。我对awk了解得越多,我就越喜欢它(在
“chr”
上使用多个分隔符,或者在这里使用
拆分
的功能是非常高效和强大的。)@Oliver:谢谢你的提醒:)
awk
功能非常强大,当您认为自己看到最多的时候,它会出现一个新的用法。请注意,这一用法会重新创建整个第1列,也就是说,它不会像OP所要求的那样在第一列中只更改带有“0”的行。[考虑到这个小例子,这似乎是同一件事,因为OP的文件似乎已经从第二个字段中获取了一些值……但这可能只是与示例的巧合?]。添加该条件将是一个简单的调整:只需在
{
之前添加
/^0/
,这样更改(拆分等)只发生在以“0”开头的行上。我的帖子中已经说明了这一点。这可以通过像这样
awk'!$1{split($2,a,:| chr”);$1=a[2]来解决1'
@Jotne:+1用于优雅和对awk用法的深入了解。我对awk了解得越多,就越喜欢它(在
“chr”
上使用多个分隔符,或者在这里使用
拆分
,效率和功能都非常强大。)@奥利弗:谢谢你的提醒:)。
awk
非常强大,当你认为你看到最多的时候,它的一个新用法就会浮出水面。请注意,这一个重新创建了整个第1列,也就是说,它不会像OP所要求的那样在第一列中只改变“0”一行。[考虑到小示例,这似乎是同一件事,因为OP的文件似乎已经从第二个字段中获取了一些值……但这可能只是与示例的巧合?]。添加条件将是一个简单的调整:只需在
{
之前添加
/^0/
,以便进行更改(拆分等)仅出现在以“0”开头的行上。我的帖子中说明了这一点。这可以通过以下方式解决:以
开头的awk!$1!$1{split($2,a,:| chr”);$1=a[2]}1'