查找不同文件的两列之间的匹配项,并将第三列替换为awk
我正在寻找一种方法来替换文件中的一列,如果两个查找不同文件的两列之间的匹配项,并将第三列替换为awk,awk,Awk,我正在寻找一种方法来替换文件中的一列,如果两个ID列匹配。 我有一个文件A.txt c a b ID 0.1 0.01 5 1 0.2 0.1 6 2 0.3 2 3 ID a b 1 10 15 2 20 16 3 30 12 4 40 14 ID a b 1 0.01 5 2 0.1 6 3 30 2 和文件B.txt c a b ID 0.1
ID
列匹配。
我有一个文件A.txt
c a b ID
0.1 0.01 5 1
0.2 0.1 6 2
0.3 2 3
ID a b
1 10 15
2 20 16
3 30 12
4 40 14
ID a b
1 0.01 5
2 0.1 6
3 30 2
和文件B.txt
c a b ID
0.1 0.01 5 1
0.2 0.1 6 2
0.3 2 3
ID a b
1 10 15
2 20 16
3 30 12
4 40 14
ID a b
1 0.01 5
2 0.1 6
3 30 2
我想要的输出是
文件A.txt
c a b ID
0.1 0.01 5 1
0.2 0.1 6 2
0.3 2 3
ID a b
1 10 15
2 20 16
3 30 12
4 40 14
ID a b
1 0.01 5
2 0.1 6
3 30 2
我发现这是可能的与以下
awk 'NR==FNR{ if(NR>1) a[$1]=$2; next }
FNR>1 && $1 in a && NF<3{ f=$2; $2=a[$1]; $3=f }1' B.txt A.txt | column -t
awk 'NR==FNR{ if(NR>1) a[$1]=$2; b[$1]=$1; next }
FNR>1 && $1~ /b[$1] in a && NF<3{ f=$2; $2=a[$1]; $3=f }1' eaf.txt final.txt | column -t
但它不起作用。有办法解决吗?谢谢您awk解决方案:
awk 'NR==FNR{ if(NR>1) a[$1]=$2; next }
FNR==1{ print $NF,$2,$3; next } # output the header line rearranged
FNR>1 && ($NF in a){ $1=$NF; if(NF<4) { f=$2; $2=a[$1]; $3=f } else $NF=""
}1' B.txt A.txt | column -t
向下投票时通常会进行注释。当使用默认的
FS
时,您需要指定FS
(例如使用tab和FS=“\t”
),因为A.txt
在NR==4
时没有$2。除此之外,这应该足够了:awk'NR==FNR{a[$1];next}$4在a{print$4,$2,$3}'bA
中。您需要告诉我们a.txt
是否是制表符分隔的或固定宽度的字段或其他内容,否则我们如何编写工具来确定第4行上缺少的值是第2行?