Bash比较具有不同字段的两个不同文件

时间:2015-04-27 21:32:45

标签: bash

我不确定这是否可行,但我想比较两个不同文件中的两个字符值。如果它们匹配,我想从其中一个文件打印出插槽2中的字段值。这是一个例子

# File 1 
Date D
Tamb B

# File 2
F gge0001x gge0001y gge0001z
D 12-30-2006 12-30-2006 12-30-2006
T 14:15:20 14:15:55 14:16:27
B 15.8 16.1 15

这是我想要做的问题背后的想法

if [ (field2) from (file1) == (field1) from (file2) ] ; do
    echo (field1 from file1) and also (field2 from file2) on the same line

which prints out "Date 12-30-2006" 
                 "Tamb 15.8"
                 " ... "

并且从基本上文件1开始不断地遍历每一行,打印出所有匹配。我假设这些将需要涉及某种数组。关于这是否是正确的逻辑以及是否可能的任何想法?

1 个答案:

答案 0 :(得分:1)

根据file1中的缩写重新格式化file2:

$ awk 'FNR==NR{a[$2]=$1;next;} $1 in a {print a[$1],$2;}' file1 file2
Date 12-30-2006
Tamb 15.8

如何运作

  • FNR==NR{a[$2]=$1;next;}

    这将读取file1的每一行,并将信息保存在数组a中。

    更详细地说,NR是到目前为止已读取的行数,FNR是到目前为止从当前文件读取的行数。所以,当NR==FNR时,我们知道awk仍在处理第一个文件。因此,仅对第一个文件执行数组赋值a[$2]=$1。语句next告诉awk跳过其余代码并跳转到next行。

  • $1 in a {print a[$1],$2;}

    由于上面的next语句,我们知道,如果我们到达这一行,我们正在处理file2。

    如果file2的字段1与file1的任何字段2匹配,则打印该行的重新格式化版本。