awk,根据不同文件的行数匹配

时间:2016-05-30 17:48:51

标签: bash unix awk command-line

我很确定这是我必须使用的awk 我有一个文件,其中包含我需要的信息和另一个文件,我需要从中获取两条信息,并根据该信息从第二个文件中获取两个数字。 因此,如果第一个文件的第五列中有m7,而第三列中有3个,我想在第二列中搜索一行中第一列为3,第四列为m7的行。我想打印这些文件中的某些列,如下所示。

给出以下两个输入文件 文件1

1 dog   3   8   m7  n15 
50 cat  5   8   m15 m22
20 fish 6   3   n12 m7  

file2的

3   695 842 m7  word
5   847 881 m15 not
8    910 920 n15 important
8   695 842 m22 word
6   312 430 n12 not

我想生成输出

pre3   695   842   21
pre5   847   881   50
pre6   312   430   20
pre8   910   920   1
pre8   695   842   50

编辑:

我还需要生成表格

的输出
pre3   695   842   pre8   910   920   1
pre5   847   881   pre8   695   842   50
pre6   312   430   pre3   695   842   20

下面的答案适用于之前的问题,但我对它的一些语法感到困惑所以我不确定如何调整它以使这个输出

2 个答案:

答案 0 :(得分:1)

此命令:

awk 'NR==FNR{ar[$5,$3]=$1+ar[$5,$3]; ar[$6,$4]=$1+ar[$6,$4]}
     NR>FNR && ar[$4,$1] {print "pre"$1,$2,$3,ar[$4,$1]}' file1 file2

输出pre加上第二个文件的第一,第二和第三列的内容以及第一个文件的第五个和第三个(或第六个和第四个)列的内容的所有行的第一个文件的第一列与第二个文件的第四列和第一列相同:

pre3 695 842 21
pre5 847 881 50
pre8 910 920 1
pre8 695 842 50
pre6 312 430 20

(对于有多个匹配的行,ar [$ 4,$ 1]的值总结)

请注意,输出不一定要排序!为此:添加sort

awk 'NR==FNR{ar[$5,$3]=$1+ar[$5,$3]; ar[$6,$4]=$1+ar[$6,$4]}
     NR>FNR && ar[$4,$1]{print "pre"$1,$2,$3,ar[$4,$1]}' file1 file2 | sort

代码是什么?

  • NR==FNR{...}仅适用于第一个输入文件
  • NR>FNR{...}适用于第2,第3,...输入文件
  • ar[$5,$3]创建一个数组,其键是当前行/记录的第5和第3列的内容(由字段分隔符分隔;通常是一个空格)

答案 1 :(得分:0)

您可以使用以下命令:

awk 'NR==FNR {a[$3 FS $5]=1;next } a[$1 FS $4]' f1.txt f2.txt

如果您只想打印第二个文件中匹配行的特定字段,请使用如下所示:

awk 'NR==FNR {a[$3 FS $5]=1;next } a[$1 FS $4] { print "pre"$1" "$2" "$3}' f1.txt f2.txt