5

我有以下格式的两个文本文件:

第一个是每一行:

Key1:Value1

第二个是这样的:

Key2:Value2

有没有一种方法可以通过使用它作为键来替换Value1in ?file1Value2file2

例如:

文件1:

foo:hello
bar:world

文件2:

hello:adam
bar:eve

我想得到:

foo:adam
bar:eve

每行的两个文件之间不一定匹配。这可以在 awk 或其他东西中巧妙地完成,还是我应该在 Python 中天真地完成?

4

7 回答 7

3

创建两个字典,每个文件一个。例如:

file1 = {}
for line in open('file1', 'r'):
    k, v = line.strip().split(':')
    file1[k] = v

或者,如果您更喜欢单线:

file1 = dict(l.strip().split(':') for l in open('file1', 'r'))

然后你可以做类似的事情:

result = {}
for key, value in file1.iteritems():
    if value in file2:
        result[key] = file2[value]

另一种方法是您可以为 file1 反向生成键值对并使用集合。例如,如果您的 file1 包含foo:bar,则您的 file1 dict 是{bar: foo}.

for key in set(file1) & set(file2):
    result[file1[key]] = file2[key]

基本上,您可以使用集合交集快速找到共同元素,因此这些元素保证在 file2 中,您不会浪费时间检查它们的存在。

编辑:正如@pepr 所指出的,collections.OrderedDict如果订单对您很重要,您可以使用第一种方法。

于 2012-05-05T08:26:14.787 回答
2

awk 解决方案:

awk '
  BEGIN {FS = OFS = ":"}
  NR==FNR {val[$1] = $2; next}
  $1 in val {$2 = val[$1]}
  {print}
}' file2 file1
于 2012-05-05T11:56:43.887 回答
1
join -t : -1 2 -2 1 -o 0 2.2 -a 2 <(sort -k 2 -t : file1) <(sort file2)

输入文件必须在它们连接的字段上进行排序。

选项:

  • -t :- 使用冒号作为分隔符
  • -1 2- 加入文件 1 的字段 2
  • -2 1- 加入文件 2 的字段 1
  • -o 0 2.2- 输出连接字段,后跟来自 file2 的字段 2(由分隔符分隔)
  • -a 2- 从 file2 输出未连接的行
于 2012-05-05T11:06:15.257 回答
0

发射器:

@(next "file2")
@(collect)
@key:@value1
@  (cases)
@    (next "file1")
@    (skip)
@value2:@key
@  (or)
@    (bind value2 key)
@  (end)
@  (output)
@value2:@value1
@  (end)
@(end)

跑:

$ txr subst.txr
foo:adam
bar:eve
于 2012-05-07T05:09:17.533 回答
0

一旦你有:

file1 = {'foo':'hello', 'bar':'world'}
file2 = {'hello':'adam', 'bar':'eve'}

你可以做一个丑陋的衬里:

print dict([(i,file2[i]) if i in file2 else (i,file2[j]) if j in file2 else (i,j) for i,j in file1.items()])
{'foo': 'adam', 'bar': 'eve'}

在您的示例中,您同时使用keysvaluesfile1keysfile2

于 2012-05-05T09:19:12.780 回答
0

这可能对您有用(可能是 GNU sed):

sed 's#\([^:]*\):\(.*\)#/\\(^\1:\\|:\1$\\)/s/:.*/:\2/#' file2 | sed -f - file1
于 2012-05-05T14:17:26.707 回答
0

如果您不考虑使用基本的 Unix/Linux 命令作弊,那么这里有一个使用 paste 和 awk 的解决方案。

paste file1.txt file2.txt | awk -F ":" '{ print $1":"$3 }'

于 2012-05-05T10:14:25.020 回答