我有两组文件如下:
添加_ *
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_ *文件中包含其余数据的行。
我意识到如果需要的话我可以先连接所有文件,但我能帮助我感觉如果不这样做就可以解决这个问题,而且我们可能会说很多文件并且对性能非常敏感例行公事,所以最好只读一次。
我希望我能够很好地解释自己!
答案 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_*