我正在gawk
中进行字符串替换。下面的代码是一个简化版本(gensub
的真正replacement
参数涉及很多"\1\3\2"
,这就是为什么我不能使用sub
/gsub
的原因(。我的问题是健壮性之一:由于我正在用gensub
修改第一个字段($1
(,我可以将gensub
的输出存储在变量$1
中,还是这可能会导致问题(在其他上下文中;它在我的代码中工作正常(?
# test data
$ printf "Header_1tHeader_2nHiC_scaffold_1_1234t1234nHiC_scaffold_2_7890t7890n" > input.txt
# code I'm using (works as expected)
$ gawk 'BEGIN {FS = "t"} FNR == 1 {next}
> {one = gensub(/HiC_scaffold_([0-9]+)_([0-9]+) ?/, "HIC_SCAFFOLD_\2_\1", "g", $1)}
> {print $2 "t" one}'
> input.txt > output.txt1
# code I'm asking about (works as expected with these test data)
$ gawk 'BEGIN {FS = "t"} FNR == 1 {next}
> {$1 = gensub(/HiC_scaffold_([0-9]+)_[0-9]+ ?/, "HIC_SCAFFOLD_\2_\1", "g", $1)}
> {print $2 "t" $1}'
> input.txt > output.txt2
$ head *txt*
==> input.txt <==
Header_1 Header_2
HiC_scaffold_1_1234 1234
HiC_scaffold_2_7890 7890
==> output.txt1 <==
1234 HIC_SCAFFOLD_1
7890 HIC_SCAFFOLD_2
==> output.txt2 <==
1234 HIC_SCAFFOLD_1
7890 HIC_SCAFFOLD_2
如果我没猜错,你要求对第二个代码进行一些审查。
你能分配一个字段吗?是的,所以$1 = gensub(something)
还可以(参考(。
潜在问题?是的:如果 $n不存在,那么您正在创建它,因此也修改了 $0。据我所知,您是在 1 美元上执行此操作,如果存在记录 ($0(,那么它必须至少有一个字段 ($1( - 可能是空的。
另一个警告是,如果您分配给 0 美元,但感觉有点超出范围。不要试图在gensub()
后$1 = $1
。
最后,让我们来看看gensub()
。如果您没有为其提供目标,则它会回退到 0 美元。你没有这样做。
最后,我看不到一个微不足道的情况,这可能会出错。你的代码对我来说似乎很好。