在包含单列值的多个文件中查找共同值
Finding common value across multiple files containing single column values
我有 100 个文本文件,每个文件包含单列。文件如下:
file1.txt
10032
19873
18326
file2.txt
10032
19873
11254
file3.txt
15478
10032
11254
等等。
每个文件的大小不同。
请告诉我如何找到所有这 100 个文件中常见的数字。
具有单个 列的文件?
您可以使用 shell:
对这些文件进行排序和比较
for f in file*.txt; do sort $f|uniq; done|sort|uniq -c -d
最后一个-c
不是必需的,只有当你想计算出现的次数时才需要。
awk
救援!
查找所有文件中的公共元素(假设同一文件中的唯一性)
awk '{a[]++} END{for(k in a) if(a[k]==ARGC-1) print k}' files
计算所有出现的次数并打印计数等于文件数的值。
无论同一个数字是否可以在 1 个文件中出现多次,这都有效:
$ awk '{a[[=10=]][ARGIND]} END{for (i in a) if (length(a[i])==ARGIND) print i}' file[123]
10032
以上将 GNU awk 用于真正的多维数组和 ARGIND。如有必要,可以轻松调整其他 awks,例如:
$ awk '!seen[[=11=],FILENAME]++{a[[=11=]]++} END{for (i in a) if (a[i]==ARGC-1) print i}' file[123]
10032
如果每个文件中的数字都是唯一的,那么您只需要:
$ awk '(++c[[=12=]])==(ARGC-1)' file*
10032
一个使用 Bash 和 comm
因为我需要知道它是否有效。我的测试文件是 1
、2
和 3
,因此 for f in ?
:
f=$(shuf -n1 -e ?) # pick one file randomly for initial comms file
sort "$f" > comms
for f in ? # this time for all files
do
comm -1 -2 <(sort "$f") comms > tmp # comms should be in sorted order always
# grep -Fxf "$f" comms > tmp # another solution, thanks @Sundeep
mv tmp comms
done
我有 100 个文本文件,每个文件包含单列。文件如下:
file1.txt
10032
19873
18326
file2.txt
10032
19873
11254
file3.txt
15478
10032
11254
等等。 每个文件的大小不同。 请告诉我如何找到所有这 100 个文件中常见的数字。
具有单个 列的文件?
您可以使用 shell:
对这些文件进行排序和比较for f in file*.txt; do sort $f|uniq; done|sort|uniq -c -d
最后一个-c
不是必需的,只有当你想计算出现的次数时才需要。
awk
救援!
查找所有文件中的公共元素(假设同一文件中的唯一性)
awk '{a[]++} END{for(k in a) if(a[k]==ARGC-1) print k}' files
计算所有出现的次数并打印计数等于文件数的值。
无论同一个数字是否可以在 1 个文件中出现多次,这都有效:
$ awk '{a[[=10=]][ARGIND]} END{for (i in a) if (length(a[i])==ARGIND) print i}' file[123]
10032
以上将 GNU awk 用于真正的多维数组和 ARGIND。如有必要,可以轻松调整其他 awks,例如:
$ awk '!seen[[=11=],FILENAME]++{a[[=11=]]++} END{for (i in a) if (a[i]==ARGC-1) print i}' file[123]
10032
如果每个文件中的数字都是唯一的,那么您只需要:
$ awk '(++c[[=12=]])==(ARGC-1)' file*
10032
一个使用 Bash 和 comm
因为我需要知道它是否有效。我的测试文件是 1
、2
和 3
,因此 for f in ?
:
f=$(shuf -n1 -e ?) # pick one file randomly for initial comms file
sort "$f" > comms
for f in ? # this time for all files
do
comm -1 -2 <(sort "$f") comms > tmp # comms should be in sorted order always
# grep -Fxf "$f" comms > tmp # another solution, thanks @Sundeep
mv tmp comms
done