我拥有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,打印这个应该足够了,比编辑一个文件更好。
答案 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
我的旧电脑上的速度非常慢。