繁体   English   中英

AWK 基于查找表的字段替换

[英]AWK field substitution based on lookup table

我正在尝试使用查找表替换 file1 的第 1 列中的值。 样本(标签分隔):

chr1 1243 A T 0.14 
chr5 1432 G C 0.0006
chr10 731 T C 0.9421
chr11 98234 T G .000032
chr12 1284 A T 0.93428
chr17 941 G T 0.1111
chr19 134325 T C 0.00001
chr21  9824 T C 0.9

查找表:

chr1 NC_000001.11 
chr2 NC_000002.12 
chr3 NC_000003.12
chr4 NC_000004.12
chr5 NC_000005.10
chr6 NC_000006.12
chr7 NC_000007.14
chr8 NC_000008.11
chr9 NC_000009.12
chr10 NC_000010.11
chr11 NC_000011.10
chr12 NC_000012.12
chr13 NC_000013.11
chr14 NC_000014.9
chr15 NC_000015.10
chr16 NC_000016.10
chr17 NC_000017.11
chr18 NC_000018.10
chr19 NC_000019.10
chr20 NC_000020.11
chr21 NC_000021.9
chr22 NC_000022.11 

正在使用的脚本:

awk 'FNR==NR{a[$1]=$2;next} {for (i in a)sub(i,a[i]);print' lookup.txt file1 > new_table.txt

output 注释哪一行是正确的/不正确的(正确答案在括号中):

NC_000001.11 1243 A T 0.14 #correct
NC_000005.10 1432 G C 0.0006 #correct
NC_000001.110 731 T C 0.9421 #incorrect (NC_000010.11)
NC_000001.111 98234 T G .000032 #incorrect (NC_000011.10)
NC_000012.12 1284 A T 0.93428 #correct
NC_000001.117 941 G T 0.1111 #incorrect (NC_000017.11)
NC_000001.119 134325 T C 0.00001 #incorrect (NC_000019.10)
NC_000021.9 9824 T C 0.9 #correct

我不明白它为什么不起作用的模式,并欢迎 awk 脚本的任何帮助。 我认为这只是那些具有两位数的人,例如 chr17 但后来 chr21 似乎工作正常。

非常感谢

不应该是:

awk 'FNR==NR{a[$1]=$2;next}{$1=a[$1]}1' lookup.txt file1

?

Output:

NC_000001.11 1243 A T 0.14
NC_000005.10 1432 G C 0.0006
NC_000010.11 731 T C 0.9421
NC_000011.10 98234 T G .000032
NC_000012.12 1284 A T 0.93428
NC_000017.11 941 G T 0.1111
NC_000019.10 134325 T C 0.00001
NC_000021.9 9824 T C 0.9

解释:

# true as long as we are reading the first file, lookup.txt
FNR==NR {
    # create a lookup array 'a' indexed by field 1 of lookup txt
    a[$1]=$2
    # don't process further actions
    next
}

# because of the 'next' statement above, this will be only executed
# when we are processing the second file, file1
{
    # translate field 1. use the value from the lookup array
    $1=a[$1]
}

# always true. print the line
1

PS:如果有可能在查找表中找不到条目,您可以为它们使用特殊文本:

awk 'FNR==NR{a[$1]=$2;next}{$1=($1 in a)?a[$1]:"NOT FOUND "$1}1' lookup.txt file1

我相信sub可能是 OP 尝试中的问题,没有彻底检查,这可以通过以下方式完成:

awk 'FNR==NR{arr[$1]=$2;next} ($1 in arr){first=$1;$1="";print arr[first],$0}' lookup_table Input_file


OP 尝试的问题(仅用于理解目的,不运行以获取显示的示例结果):虽然 OP 的代码显示一个看起来并不完整,以找出它为什么根据 OP 的问题给出错误的 output,我已经写了它如下。

awk 'FNR==NR{a[$1]=$2;next} {for (i in a){line=$0;if(sub(i,a[i])){print (Previous line)line">>>(array key)"i"....(array value)"a[i]"............(new line)"$0}}}' lookup_table Input_file

因此,每当发生适当的替换时,只需按如下方式打印该行,我们可以在其中看到 OP 的代码出了什么问题。

chr1 1243 A T 0.14 chr1 1243 A T 0.14 >>>(array key)chr1....(array value)NC_000001.11............(new line)NC_000001.11 1243 A T 0.14
chr5 1432 G C 0.0006chr5 1432 G C 0.0006>>>(array key)chr5....(array value)NC_000005.10............(new line)NC_000005.10 1432 G C 0.0006
chr10 731 T C 0.9421chr10 731 T C 0.9421>>>(array key)chr1....(array value)NC_000001.11............(new line)NC_000001.110 731 T C 0.9421
chr11 98234 T G .000032chr11 98234 T G .000032>>>(array key)chr1....(array value)NC_000001.11............(new line)NC_000001.111 98234 T G .000032
chr12 1284 A T 0.93428chr12 1284 A T 0.93428>>>(array key)chr12....(array value)NC_000012.12............(new line)NC_000012.12 1284 A T 0.93428
chr17 941 G T 0.1111chr17 941 G T 0.1111>>>(array key)chr1....(array value)NC_000001.11............(new line)NC_000001.117 941 G T 0.1111
chr19 134325 T C 0.00001chr19 134325 T C 0.00001>>>(array key)chr1....(array value)NC_000001.11............(new line)NC_000001.119 134325 T C 0.00001
chr21  9824 T C 0.9chr21  9824 T C 0.9>>>(array key)chr21....(array value)NC_000021.9............(new line)NC_000021.9  9824 T C 0.9

我们可以很容易地看到从chr1 1243 AT 0.14 chr1 1243 AT 0.14NC_000001.11 1243 AT 0.14 1243 AT 0.14 的old line ,这是因为数组键(chr1)被数组值(NC_000001.11)替换如果你看到上面显示的 Z78E6221F6393D1356681DB398F14CE6目的。

看起来 sub 是导致问题的原因,因此只需将 $1 指定的索引值添加到带有空格的行并用简写 1 打印该行,因此:

awk 'FNR==NR{a[$1]=$2;next} {$0=a[$1]" "$0 }1' lookup.txt file1 > new_table.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM