如何用另一个文件(python或awk)中包含的另一个整数替换列中的整数

如何用另一个文件(python或awk)中包含的另一个整数替换列中的整数,python,file,replace,awk,Python,File,Replace,Awk,我有两个大文件。在第一个文件中,我有一列整数,需要用另一个大文件(第二个文件)中包含的其他整数替换 第二个文件包含一列,几乎包含第一个文件的每个整数,第二列包含用于替换的整数。因此,如果两个文件中都有整数,则将该整数替换为第二列同一行中的整数 DESIRED OUTPUT FILE 200 201 203 204 两个输入文件都非常大,并且都有以#开头的其他列和标题。请尝试以下操作: replace = {} with open('2nd') as f: for line in f:

我有两个大文件。在第一个文件中,我有一列整数,需要用另一个大文件(第二个文件)中包含的其他整数替换

第二个文件包含一列,几乎包含第一个文件的每个整数,第二列包含用于替换的整数。因此,如果两个文件中都有整数,则将该整数替换为第二列同一行中的整数

DESIRED OUTPUT FILE

200
201
203
204
两个输入文件都非常大,并且都有以
#

开头的其他列和标题。请尝试以下操作:

replace = {}
with open('2nd') as f:
    for line in f:
        splt = line.split()
        thing = splt[0]
        new = splt[1]
        replace[thing] = new

with open('1st') as f:
    for line in f:
        if line[0] == '#':
            print line
        else:
            splt = line.split()
            thing = splt[0]
            splt[0] = replace.get(thing, thing)
            print '\t'.join(splt)  # no idea what's your real delimiter

您可以将第一个文件中的项目存储在一个集合中,在对第二个文件进行迭代期间,只需检查该集合中是否存在整数。(集合提供
O(1)
lookup,并且只存储唯一的项目)

输出:

200
201
203
204
使用
awk

awk 'NR==FNR {a[$1]=$2; next} {if ($1 in a) {$1=a[$1]}}1' f2 f1
给定扩展输入文件
f1
,它将返回:

200
12345
201
125
203
204
133
请注意,我使用的文件
f1
还有一些记录,因此在
f2
中有一些记录不匹配:

$ cat f1
123
12345
124
125
126
127
133
更新
这是非常快,但它仍然打印行,如果没有匹配的 两个整数,我不希望。。。那怎么可能呢 案例

如果您只想打印匹配项,请使用:

$ awk 'NR==FNR {a[$1]=$2; next} $1 in a {$1=a[$1]; print}' f2 f1
200
201
203
204

如果两个输入文件都已排序,并且两个第一列上的数字都是唯一的,则这样做不会消耗在RAM上加载其中一个文件所需的额外内存

import sys

def replace(in1, in2, out):
    for num1, num2 in (x.split() for x in in2):
        for col1 in in1:
            if col1.strip() == num1:
                out.write(num2 + '\n')
                break
        else:
            # End if in1
            break

replace(open('1st'), open('2nd'), sys.stdout)

是的,对不起。。你是对的。我看到了,但不是第二个文件的第二列==所需的输出文件吗?那么您尝试了什么?你的代码段在哪里。你的文件排序了吗?那么这些文件实际上是什么样子的?这非常快,但是如果两个整数都不匹配,它仍然会打印行,我不希望。。。如果是那样的话,那会是怎样的呢?确切地说。。我很抱歉,你有理由。。。我想让问题变得简单,但没有成功。谢谢,成功了!:)<代码>{if($1 in a){print a[$1]}->
$1 in a{print a[$1]}
但我认为从阅读老年退休金计划的评论来看,她真正想要的是
$1 in a{$1=a[$1];print}
。解决一个问题,然后让操作人员告诉你“哦,但我的输入实际上与我发布的示例不一样”,这总是很有趣的。你所遇到的人中有一半的智商低于平均水平,这进一步证实了一个真理:-)。哈哈哈,你的评论总是值得阅读和保留的,@EdMorton。在我对OP的最后一次评论中,我表示使用
打印a[$1],$2…
(是“他”,因为安格尔在加泰罗尼亚语中是阳性的:D),但你的版本要好得多,所以我正在用你的建议更新我的答案。是的,我想补充一点,超过一半的问题低于平均要求:)哈哈哈,我完全同意你说的Ed。。。正如我所说,我不想提出一个很长的问题,这样就更容易回答和阅读。。。然后我会根据我最后的需要修改它。。。但在awk和编程方面,我是一个可怕的傻瓜,我自己解决不了这个问题。下次我知道这一课
$ awk 'NR==FNR {a[$1]=$2; next} $1 in a {$1=a[$1]; print}' f2 f1
200
201
203
204
import sys

def replace(in1, in2, out):
    for num1, num2 in (x.split() for x in in2):
        for col1 in in1:
            if col1.strip() == num1:
                out.write(num2 + '\n')
                break
        else:
            # End if in1
            break

replace(open('1st'), open('2nd'), sys.stdout)
awk 'NR==FNR{map[$1]=$2;next} {printf "%s", ($1 in map ? map[$1] RS : "")}' file2 file1