我一直试图在BASH中找到一个很好的方法来查找列表A
中也存在的列表B
中的第一个条目。 A
和B
位于不同文件中的位置。
A B
1024dbeb 8e450d71
7e474d46 8e450d71
1126daeb 1124dae9
7e474d46 7e474d46
1124dae9 3217a53b
在上面的示例中,7e474d46
是A
中的第一个条目,也出现在B
中,所以我会返回7e474d46
。
注意: A
可以有数百万条记录,而B
可以是大约300条。
答案 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