匹配2个文件列表之间的记录(使用awk?)

时间:2017-06-12 06:39:57

标签: bash awk

我有两组文件如下:

  

添加_ *

     

upd_ *

(由*表示的内容仅仅是在上下文中创建一个唯一的文件名)

  

add_ *文件包含:with space seperators

     

upd_ *文件包含:

现在,我想得到一个实际有匹配的所有值的列表(反之亦然,因为它的结果相同)。我觉得我应该能够在awk中做到这一点,但由于多文件输入的缘故,我一直在苦苦挣扎。

以下是使用简化数据的具体示例:

add_1001

  

ABC123 xxxxxxxxxxxxxxxxxxx

     

DEF234 xxxxxxxxxxxxxxxxxxx

add_1002

  

EFG987 XXXXXXXXXXXXXXXXXXX

add_1003

  

ABC123 XXXXXXXXXXXXXXXXXXX

add_1004

  

XYZ666 xxxxxxxxxxxxxxxxxxx

upd_9001

  

ABC123

upd_9002

  

XYZ666

     

LMN001

upd_9003

  

UUU_123

所以在这里我希望生成以下列表

  

ABC123

     

XYZ666

如果我得到ABC123的双倍,那没问题。同样,如果输出实际上是add_ *文件中包含其余数据的行。

我意识到如果需要的话我可以先连接所有文件,但我能帮助我感觉如果不这样做就可以解决这个问题,而且我们可能会说很多文件并且对性能非常敏感例行公事,所以最好只读一次。

我希望我能够很好地解释自己!

3 个答案:

答案 0 :(得分:0)

怎么样?
grep -F -f <(cat upd_*) add_*

或者如果标记用空格分隔

grep -F -f <(cat upd_*| tr ' ' '\n') add_*

或仅显示没有文件名的匹配

grep -F -f <(cat upd_*| tr ' ' '\n') -h -o add_*

答案 1 :(得分:0)

最简单的是comm -12 <(sort add_*) <(sort upd_*)

检查它是否表现得足够好,很可能会。

答案 2 :(得分:0)

由于您要求awk解决方案:

awk 'FILENAME ~ "upd" {data[$1]=1; next}
    {if ($1 in data) { print $0; delete data[$1]}}' upd_* add_*