需要帮助理解awk命令来组合两个文件

时间:2014-08-31 12:55:03

标签: awk

我正在尝试比较基于公共列的两个文件(第一个文件中的$ 2和第二个文件中的$ 4)并打印两个文件中的匹配记录,但是我使用的awk的问题是,它是打印的只有第二个文件中的记录。

任何人都可以为此提供解决方案吗? 文件1

111,abc
222,abc
111,bcd

file2的

1,123,345,abc
2,234,232,bcd
2,hhh,343,bcd

期望的输出:

111,abc,1,123,345,abc
222,abc,1,123,345,abc
111,bcd,2,234,232,bcd
111,bcd,2,hhh,343,bcd

使用下面的awk命令我得到了这样的输出

awk -F, 'NR==FNR {a[$2];next } (($4) in a) {print $0","a[$1]}' file file2
1,123,345,abc,
2,234,232,bcd,
2,hhh,343,bcd,

不要在输出中的[$ 1]处获取任何值。

2 个答案:

答案 0 :(得分:1)

首先让我说你永远不会用你开始的方法得到那个输出。不要忘记Ed在帖子中建议的更正,但是您使用的是重复的列作为键。当你这样做时,该键所持有的初始值会丢失,并被最近看到的值取代。

要实现该输出,您应该做的是创建一个唯一的复合键。我将如何做到这一点:

awk '
BEGIN { FS = OFS = "," }          # Set your input and output separator in BEGIN block
NR==FNR { line[$0]; next }        # Load the entire line as key as columns can repeat
{
    for (key in line) {           # Iterate through your array
        split (key, arry, /,/);   # Split your key on "," and store in an array
        if (arry[2] == $4) {      # If that key is matching your column 4
            print key, $0         # Print the entire key long with entire line from file2
        }
    }
}' file1 file2
111,abc,1,123,345,abc
222,abc,1,123,345,abc
111,bcd,2,234,232,bcd
111,bcd,2,hhh,343,bcd

答案 1 :(得分:0)

您需要设置FSOFS变量来告诉awk您的字段是逗号分隔的(请参阅awk手册页),然后使用第2个字段填充a[]从file1(例如abc)作为它的索引,然后在测试它时你从文件中使用4美元(例如再次abc)这似乎是合理的但是当你打印时你试图使用它来访问它的内容来自file2的第一个字段(例如1),而不是它的索引。想一想。