首页 > 解决方案 > 使用 gensub 时在 gawk 中命名变量

问题描述

我正在做字符串替换gawk。下面的代码是一个简化版本(真正的replacement论点gensub涉及很多"\\1\\3\\2",这就是为什么我不能使用sub/ gsub)。我的问题是稳健性之一:由于我正在使用 修改第一个字段 ( ) ,$1gensub可以将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

标签: awk

解决方案


如果我没听错,您是在要求对第二个代码进行一些审查。

你能分配一个字段吗?是的,$1 = gensub(something)没关系(参考)。

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

另一个警告是,如果您分配给 $0,但感觉有点超出范围。不要试图$1 = $1在你的gensub().

最后,让我们来看看gensub()。如果你没有为它提供目标,那么它会回退到使用 $0。你没有这样做。

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


推荐阅读