在包含单列值的多个文件中查找共同值

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 因为我需要知道它是否有效。我的测试文件是 123,因此 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