如何比较文件的两个字符串使用AWK匹配另一个文件的字符串?

时间:2015-07-24 09:50:00

标签: awk

我拥有2个巨大的文件,我需要计算文件2中存在多少条文件1。

文件1包含两个ID,源和目标,如下所示:

11111111111111|22222222222222
33333333333333|44444444444444
55555555555555|66666666666666
11111111111111|44444444444444
77777777777777|22222222222222
44444444444444|00000000000000
12121212121212|77777777777777
01010101010101|01230123012301
77777777777777|97697697697697
66666666666666|12121212121212

文件2包含有效的id列表,用于过滤文件1:

11111111111111
22222222222222
44444444444444
77777777777777
00000000000000
88888888888888
66666666666666
99999999999999
12121212121212
01010101010101

我正在努力实现的是找到一种方法来计算文件一中有多少条目拥有文件2中的条目。只有当两个数字在同一行中时 存在于文件2中的行将被计​​算。

档案2:

11111111111111|22222222222222 - 这将被计算在内,因为文件2和77777777777777|22222222222222都存在这两个条目,因为这两个条目都存在于文件2上。

33333333333333|44444444444444 - 这不会被计算在内,因为33333333333333在文件2上不存在,而55555555555555|66666666666666也是如此,第一个在文件2上不存在。

因此,在开头我提到的示例中,它应该计为6,打印这个应该足够了,比编辑一个文件更好。

2 个答案:

答案 0 :(得分:1)

awk -F'|' 'FNR == NR { seen[$0] = 1; next }
           seen[$1] && seen[$2] { ++count }
           END { print count }' file2 file1

说明:

1)FNR == NR(当前文件中的记录数等于记录数)仅对第一个输入文件为真,即file2(顺序很重要!)。因此,对于file2的每一行,我们都会在seen中记录数字。

2)对于其他行(file1,在命令行中给定第二行),如果| - 分隔的字段(-F'|')编号1和2都是{{1 (在seen)中,我们将file2增加一个。

3)在count输出END

警告:count中的每个唯一编号都会加载到内存中。但这也使得它快速而不必一遍又一遍地阅读file2

答案 1 :(得分:0)

不知道如何在awk中执行此操作,但如果您对某人可以帮助提高效率的快速繁琐的bash脚本持开放态度,您可以尝试这样做:

searcher.sh
-------------
#!/bin/bash

file1="$1"
file2="$2"

-- split by pipe
while IFS='|' read -ra line; do

    -- find 1st item in file2. If found, find 2nd item in file2 
    grep -q ${line[0]} "$file2"
    if [ $? -eq 0 ]; then

        grep -q ${line[1]} "$file2"
        if [ $? -eq 0 ]; then

            -- print line since both items were found in file2
            echo "${line[0]}|${line[1]}"

        fi

    fi

done < "$file1"

Usage
------
bash searcher.sh file1 file2

Result using your example
--------------------------
$ time bash searcher.sh file1 file2
11111111111111 | 22222222222222
11111111111111 | 44444444444444
77777777777777 | 22222222222222
44444444444444 | 00000000000000
12121212121212 | 77777777777777
66666666666666 | 12121212121212

real    0m1.453s
user    0m0.423s
sys     0m0.627s

我的旧电脑上的速度非常慢。