比较两个未分类的文件

时间:2011-07-14 16:03:56

标签: bash shell

我有两个标签分隔文件(请参阅下面的示例):

档案1

Java    RAJ
PERL    ALEX
PYTHON  MAurice

(依此类推)

文件2

ALEX    3.4
SAM     8.9
PEPPER  9.0

现在,如果例如在文件2中也找到ALEX(不确定是否会找到ALEX),我应该有第三个文件:

PERL ALEX 3.4

代码应该检查file2中文件1的第2列中的所有值。

有关bash脚本的任何建议吗?

4 个答案:

答案 0 :(得分:6)

您想使用join。首先,您需要根据连接字段进行排序:

join -1 2 -2 1 <(sort +1 -2 file1) <(sort +0 -1 file2)

答案 1 :(得分:5)

awk 'NR==FNR {val[$1]=$2; next} $2 in val {print $0, val[$2]}' file2 file1

答案 2 :(得分:1)

PERL的单行也行吗? 工作没有排序.. 假设您的文件名为f1和f2 ..

perl -e 'open(F1, shift); open(F2, shift); $ls = $/;undef $/;$f2 = <F2>;$/ = $ls; while(<F1>) { ($t1, $t2) = $_ =~ /^(\w+)\s+(\w+)$/; if($t1) { ($t3) = $f2 =~ /^$t2\s+(.+)$/m; print "$t1 $t2 $t3 \n" if ($t3); } }' f1 f2

使用f1:

Java RAJ

PERL ALEX

PYTHON Maurice

和f2:

ALEX 3.4
SAM 8.9
PEPPER 9.0

结果:

PERL ALEX 3.4

答案 3 :(得分:1)

你使用 join awk 获得了很好的答案,所以我认为我发布了一个纯粹的bash-one:

#!/bin/bash

declare -A name2prog
declare -A name2num

while read a b; do name2prog[$b]=$a; done < file1
while read a b; do name2num[$a]=$b; done < file2

for i in "${!name2num[@]}"
do
    if  [[ ${name2prog[$i]} ]]; then
        echo ${name2prog[$i]} $i ${name2num[$i]}
    fi
done

输出:

$ ./try.sh
PERL ALEX 3.4