我正在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
答案 0 :(得分:0)
如果我正确理解了您,则您要求对第二个代码进行一些审查。
您可以分配一个字段吗?是的,所以$1 = gensub(something)
没问题(ref)。
潜在问题?是:如果$ n 不存在,则说明您正在创建它,因此也修改了$ 0。据我所知,您正在$ 1上执行此操作,如果一条记录存在($ 0),那么它必须至少有一个字段($ 1)-可能为空。
另一个警告是,如果您分配给$ 0,但感觉有点超出范围。在您的$1 = $1
之后,请勿尝试gensub()
。
最后,让我们看一下gensub()
。如果您没有为其提供目标,则它会退回到使用$ 0的位置。您不是这样做的。
最后,我看不到这可能出错的琐碎情况。您的代码对我来说似乎不错。