awk - 使用 gensub 时在 gawk 中命名变量
问题描述
我正在做字符串替换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 = gensub(something)
没关系(参考)。
潜在问题?是的:如果 $ n不存在,那么您正在创建它,因此也修改了 $0 。据我所知,您在 $1 上执行此操作,如果记录存在 ($0),那么它必须至少有一个字段 ($1) - 可能为空。
另一个警告是,如果您分配给 $0,但感觉有点超出范围。不要试图$1 = $1
在你的gensub()
.
最后,让我们来看看gensub()
。如果你没有为它提供目标,那么它会回退到使用 $0。你没有这样做。
最后,我看不到可能出错的微不足道的情况。你的代码对我来说似乎很好。