【发布时间】:2014-06-13 02:27:49
【问题描述】:
我有一个 CSV 文件 (file1),看起来像这样:
123,info,ONE NAME
124,info,ONE VARIATION
125,info,NAME ANOTHER
126,info,SOME TITLE
还有另一个 CSV 文件 (file2),如下所示:
1,info,NAME FIRST
2,info,TWO VARIATION
3,info,NAME SECOND
4,info,ANOTHER TITLE
我想要的输出是:
1,123,NAME FIRST,ONE NAME
3,125,NAME SECOND,NAME ANOTHER
如果file2 的逗号分隔字段3 中的第一个单词(即:第1 行中的NAME)等于file1 的字段3 中的任何单词,则打印一行格式为:
field1(file2),field1(file1),field3(file2),field3(file1)
每个文件的行数相同,只有当每个文件的行号相同时才会进行匹配。
我知道我可以像这样在 Awk 中拆分字段并获取 field3 中的第一个单词:
awk -F"," '{split($3,a," "); print a[1]}' file
但由于我在 Awk 方面的能力只有中等,我不知道如何处理使用拆分比较两个文件的工作。
我可以像这样在 Python 中做到这一点:
with open('file1', 'r') as f1, open('file2', 'r') as f2:
l1 = f1.readlines()
l2 = f2.readlines()
for i in range(len(l1)):
line_1 = l1[i].split(',')
line_2 = l2[i].split(',')
field_3_1 = line_1[2].split()
field_3_2 = line_2[2].split()
if field_3_2[0] in field_3_1:
one = ' '.join(field_3_1)
two = ' '.join(field_3_2)
print(','.join((line_2[0], line_1[0], two, one)))
但我想知道如何在 Awk 中完成这样的工作,因为我偶尔会使用只有 Awk 可用的 shell。
这似乎是一项奇怪的任务,我认为我的示例可能有点令人困惑,但我需要执行此操作以检查其中一个文件中是否存在损坏/格式错误的数据。
【问题讨论】:
-
为什么 NAME FIRST 匹配 ONE NAME 而不是 NAME ANOTHER?我建议发布一些真实数据以获得更好的答案。
-
@jaypal 因为它们的行号不同。我会更新以澄清。