H,我想替换所有行中的特定字符匹配(.),使用第一行作为参考
我尝试重新哈希我得到的另一个问题的答案:
awk -F'|' 'BEGIN{OFS=FS} NR==1 {for(i=1;i<=NF;i++) a[$i] } NR>1 {for(i in a) if( $i == "\." ) $i="a"}1'
...我在上面的代码中尝试的重新工作的想法是将第一行字符存储在“a”中,然后当看到“.”时在 rows>1 中更改 '.'到存储在“a”中的相应列字符。但它没有起作用。
输入:
A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
.|C|G|A|T|T|.|.|G|C|.|.|.|A|C|R|C|.|T|T
A|.|.|.|N|.|T|T|N|.|.|A|C|.|.|R|.|.|.|.
期望的输出:
A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
A|C|G|A|T|T|T|P|G|C|Q|A|R|A|C|R|C|V|T|T
A|N|G|O|N|T|T|T|N|C|Q|A|C|A|S|R|U|V|T|T
答案1
正确的想法-错误的实施
你需要存储该字段价值观在由字段索引的数组中位置。所以,代替
a[$i]
,使a[i]=$i
那么你需要查找值按索引在数组中。所以不是
$i="a"
但是$i=a[i]
顺便说一句,$i == "\."
这不是正则表达式测试,所以你不需要转义.
$ awk -F'|' 'BEGIN{OFS=FS} NR==1 {for(i=1;i<=NF;i++) a[i]=$i } NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1' file
A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
A|C|G|A|T|T|T|P|G|C|Q|A|R|A|C|R|C|V|T|T
A|N|G|O|N|T|T|T|N|C|Q|A|C|A|S|R|U|V|T|T
作为埃德·莫顿指出,您可以通过使用 awk 内置split
函数替换显式循环来改进解决方案:
awk -F'|' 'BEGIN{OFS=FS} NR==1 {split($0,a)} NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1'