使用gensub时在gawk中命名变量

时间:2020-02-11 15:23:50

标签: awk

我正在gawk中进行字符串替换。以下代码是简化版本(replacement的真实gensub参数涉及很多"\\1\\3\\2",这就是为什么我不能使用sub / gsub的原因)。我的问题是鲁棒性之一:由于我正在用$1修改第一字段(gensub),因此可以将gensub的输出存储在变量$1中,还是这是否有可能引起问题(在其他情况下;在我的代码中工作正常)?

# test data
$ printf "Header_1\tHeader_2\nHiC_scaffold_1_1234\t1234\nHiC_scaffold_2_7890\t7890\n" > 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 个答案:

答案 0 :(得分:0)

如果我正确理解了您,则您要求对第二个代码进行一些审查。

您可以分配一个字段吗?是的,所以$1 = gensub(something)没问题(ref)。

潜在问题?是:如果$ n 不存在,则说明您正在创建它,因此也修改了$ 0。据我所知,您正在$ 1上执行此操作,如果一条记录存在($ 0),那么它必须至少有一个字段($ 1)-可能为空。

另一个警告是,如果您分配给$ 0,但感觉有点超出范围。在您的$1 = $1之后,请勿尝试gensub()

最后,让我们看一下gensub()。如果您没有为其提供目标,则它会退回到使用$ 0的位置。您不是这样做的。

最后,我看不到这可能出错的琐碎情况。您的代码对我来说似乎不错。

相关问题