python或awk比较文件

2024-10-01 05:06:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个文件是制表符分隔的。我需要比较文件1列3和文件2列1。如果有匹配项,我需要在文件1中匹配行旁边写入文件2的列2。下面是我的文件示例:

文件1:

a rao rocky1 beta

b rao buzzy2 beta

c Rachel rocky2 alpha

文件2:

^{pr2}$

输出:

新文件:

a rao rocky1 beta highlightpath

b rao buzzy2 beta

c Rachel rocky2 alpha greenpath

问题是文件1太大了!文件2也很大,但没有那么大。 到目前为止,我尝试了awk命令,它部分工作。我的意思是文件1和输出文件中的行数应该相同,这不是我得到的!我得到了20行的差别。在

awk 'FNR==NR{a[$3]=$0;next}{if($1 in a){p=$1;$1="";print a[p],$0}}' file1 file2 > newfile

所以我想我可以试试python,但我是python的新手。到目前为止,我只知道我想为文件1和文件2制作一本词典并进行比较。我知道如何把文件读入字典,然后我就知道了空白。任何对代码的帮助和建议将有所帮助。 谢谢


Tags: 文件命令alpha示例制表符betaawkrao
3条回答

这里有一个更简短的awk

awk 'NR==FNR {a[$1]=$2;next} {print $0,$3 in a?a[$3]:""}' file2 file1
a rao rocky1 beta highlightpath

b rao buzzy2 beta

c Rachel rocky2 alpha greenpath
import sys

# Usage: python SCRIPT.py FILE1 FILE2 > OUTPUT
file1, file2 = sys.argv[1:3]

# Store info from the smaller file in a dict.
d = {}    
with open(file2) as fh:
    for line in fh:
        k, v = line.split()
        d[k] = v

# Process the bigger file line-by-line, printing to standard output.
with open(file1) as fh:
    for line in fh:
        line = line.rstrip()
        k = line.split()[2]
        if k in d:
            print line, d[k]
        else:
            print line
with open('outfile.txt', 'w') as outfile:
     with open('file1.txt', 'r') as f1:
          with open('file2.txt', 'r') as f2:

               for f1line in f1:
                    for f2line in f2:
                         ## remove new line character at end of each line
                         f1line = f1line.rstrip()
                         f2line = f2line.rstrip()

                         ## extract column fields
                         f1col3 = f1line.split('\t')[2]
                         f2col1 = f2line.split('\t')[0]

                         ## test if fields are equal
                         if (f1col3 == f2col1 ):
                              outfile.write('%s\t%s\n' % (f1line,
                                                          f2line.split('\t')[1]))
                         else:
                              outfile.write('%s\t\n' % (f1line))

                         break
  • 此脚本将比较文件1&2的第1行,然后比较文件1&2的第2行、第3行。。。等。。。在
  • 适用于大文件;不应加载内存:)

相关问题 更多 >