使用 gensub 时在 gawk 中命名变量



我正在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 美元。你没有这样做。

最后,我看不到一个微不足道的情况,这可能会出错。你的代码对我来说似乎很好。

最新更新