利用awk、perl或python快速匹配不同文件中的列

61 阅读2分钟

用户想要从两个文件file1和file2中匹配特定列,并根据匹配结果输出包含匹配列以及其他列的信息。具体而言,需要从file1中提取第2列的数据,从file2中提取最后1列的数据。如果这两列数据匹配,还需要从file1中提取第5列的数据,并将其与file2中倒数第2列的数据进行乘积计算,然后将所有这些数据一起输出。由于文件非常大,用户尝试使用awk来处理,但发现效率低下,导致计算机崩溃。

image.png

2、解决方案

方法1:使用Python

import csv

# 读取file1并将其存储在字典中
with open('file1.csv', 'r') as f1:
    reader = csv.reader(f1)
    file1_dict = {row[1]: row[4] for row in reader}

# 读取file2并将其存储在列表中
with open('file2.csv', 'r') as f2:
    reader = csv.reader(f2)
    file2_list = [row for row in reader]

# 处理file2中的每一行
for row in file2_list:
    # 检查file2中的最后1列是否存在于file1_dict中
    if row[-1] in file1_dict:
        # 从file1_dict中获取对应的第5列数据
        file1_5 = file1_dict[row[-1]]

        # 计算file1_5与file2中倒数第2列数据的乘积
        product = int(file1_5) * int(row[-2])

        # 将所有需要输出的数据拼接到一起
        output_row = ' '.join(row) + ' ' + file1_5 + ' ' + str(product)

        # 输出结果
        print(output_row)

方法2:使用Perl

use strict;
use warnings;

# 读取file1并将其存储在哈希表中
open my $fh1, '<', 'file1.txt' or die $!;
my %file1;
while (<$fh1>) {
    my ($f1_2, $f1_5) = split;
    $file1{$f1_2} = $f1_5;
}

# 读取file2并将其存储在数组中
open my $fh2, '<', 'file2.txt' or die $!;
my @file2;
while (<$fh2>) {
    push @file2, [split];
}

# 处理file2中的每一行
foreach my $row (@file2) {
    # 检查file2中的最后1列是否存在于file1哈希表中
    if (exists $file1{$row->[-1]}) {
        # 从file1哈希表中获取对应的第5列数据
        my $file1_5 = $file1{$row->[-1]};

        # 计算file1_5与file2中倒数第2列数据的乘积
        my $product = $file1_5 * $row->[-2];

        # 将所有需要输出的数据拼接到一起
        my $output_row = join(' ', @$row) . ' ' . $file1_5 . ' ' . $product;

        # 输出结果
        print "$output_row\n";
    }
}

方法3:使用awk

BEGIN {
    # 读取file1并将其存储在数组中
    while ((getline < "file1.txt") > 0) {
        file1[$2] = $5
    }
}

# 读取file2并输出结果
{
    # 检查file2中的最后1列是否存在于file1数组中
    if ($NF in file1) {
        # 从file1数组中获取对应的第5列数据
        file1_5 = file1[$NF]

        # 计算file1_5与file2中倒数第2列数据的乘积
        product = file1_5 * $(NF-2)

        # 将所有需要输出的数据拼接到一起
        output = $0 " " file1_5 " " product

        # 输出结果
        print output
    }
}

在这些解决方案中,Python版本最易于阅读和理解,但Perl和awk版本在性能方面可能更胜一筹。您应该根据自己的具体需求和性能要求来选择最合适的解决方案。