我正在尝试比较基于公共列的两个文件(第一个文件中的$ 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]处获取任何值。
答案 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)
您需要设置FS
和OFS
变量来告诉awk您的字段是逗号分隔的(请参阅awk手册页),然后使用第2个字段填充a[]
从file1(例如abc
)作为它的索引,然后在测试它时你从文件中使用4美元(例如再次abc
)这似乎是合理的但是当你打印时你试图使用它来访问它的内容来自file2的第一个字段(例如1
),而不是它的索引。想一想。