繁体   English   中英

如何使用awk合并具有公共字段的文件并在另一个文件中打印

[英]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.

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