[英]how to use awk to merge files with common fields and print in another file
我已经阅读了所有相关问题,但仍然感到困惑。
我有两个文件选项卡分开。
file1 (已添加中断以提高可读性):
a 15 bac
g 10 bac
h11 bac
r 33 arq
t 12 euk
file2 (已添加中断以提高可读性):
0 15 h 3 5 2 gf a a g e g s s g g
p 33 g 4 5 2 hg 3 1 3 f 5 h 5 h 6
g 4 r 8 j 9 jk 9 j 9 9 h t 9 k 0
所需的输出(增加了可读性)
bac 15 h 3 5 2 gf a a g e g s s g g
arq 33 g 4 5 2 hg 3 1 3 f 5 h 5 h 6
ND g 4 r 8 j 9 jk 9 j 9 9 h t 9 k 0
只是。 我需要打印完整的文件2,但在第一列,我需要与文件1的第三列,以取代只有当$2
文件2的相同是$2
文件1的...
file1大于file2 ,但仍然可能发生file1中不存在来自file2的 $2
情况,在这种情况下,在第一列ND中打印。
我敢肯定它必须很简单,但是我在用awk
管理两个文件时遇到了问题。 拜托,如果有人可以帮助我...
使用以下awk命令:
awk 'FNR==NR{a[$2]=$3;next} {$1=(a[$2])?a[$2]:"ND"} 1' file1 file2
bac 15 h 3 5 2 gf a a g e g s s g g
arq 33 g 4 5 2 hg 3 1 3 f 5 h 5 h 6
ND 4 r 8 j 9 jk 9 j 9 9 h t 9 k 0
说明:
FNR==NR
对输入中的第一个文件(即file1
执行此块 a[$2]=$3
$3
从文件a[$2]=$3
填充键为$2
且值为$3
的关联数组a
next
-读取下一行,直到第一个文件的EOF
file2
$1=(a[$2])?a[$2]:"ND"
-如果在数组a
找到$2
则用a[$2]
覆盖$1
,否则用文字字符串"ND"
1
打印输出 您可以尝试使用join + awk命令,如下所示:
join -t ' ' -a2 -1 2 -2 2 test1.txt test2.txt | awk 'BEGIN { start = 5; end = 18 } { if (NF == 16) { temp = $1; $1 = "ND " $2; $2 = temp; print } else { printf("%s %s ", $3, $1); for (i=start; i<=end; i++) printf ("%s ", $i); printf("\n");}}'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.