bash:标识另一个列表中也存在的第一个值列表

时间:2017-06-26 11:09:31

标签: bash

我一直试图在BASH中找到一个很好的方法来查找列表A中也存在的列表B中的第一个条目。 AB位于不同文件中的位置。

   A         B
1024dbeb  8e450d71
7e474d46  8e450d71
1126daeb  1124dae9
7e474d46  7e474d46
1124dae9  3217a53b

在上面的示例中,7e474d46A中的第一个条目,也出现在B中,所以我会返回7e474d46

注意: A可以有数百万条记录,而B可以是大约300条。

3 个答案:

答案 0 :(得分:1)

虽然很少有几点不清楚,比如A列表中的数字是否会出现2次或更多?(在你给出的例子中,d46来了2次)。考虑到您需要列表B中存在的列表A的所有行号,以下内容将帮助您。

awk '{col1[$1]=col1[$1]?col1[$1]","FNR:FNR;col2[$2];} END{for(i in col1){if(i in col2){print col1[i],i}}}'  Input_file

OR(上述解决方案的非单一班轮形式)

awk '{
        col1[$1]=col1[$1]?col1[$1]","FNR:FNR;
        col2[$2];
     }
        END{
                for(i in col1){
                                if(i in col2){
                                                print col1[i],i
                                             }
                              }
           }
    '   Input_file

以上代码将提供以下输出。

3,5 7e474d46
6 1124dae9

在这里创建数组col1,其索引是第一个字段,数组col2,其索引是$ 2。 col1的值是当前行的值,它也将连接它自己的值。现在在awk的END部分中遍历col1数组,然后检查col1中是否存在任何col1值,如果是,则打印col1的值及其索引。

答案 1 :(得分:1)

awk 是你的朋友。

awk 'NR==FNR{a[$1]++;next}{if(a[$1]>=1){print $1;exit}}' file2 file1
7e474d46

注意:也请检查此答案的[ previous version ],并假设这些值在单个文件中列为两列。在您澄清了值在[ this ]注释中作为两个文件提供之后,就会写下这个。

答案 2 :(得分:0)

如果您有GNU grep,可以试试这个:

grep -m 1 -f B A