【问题标题】:Finding common value across multiple files containing single column values在包含单列值的多个文件中查找共同值
【发布时间】:2017-09-14 07:07:42
【问题描述】:

我有 100 个文本文件,每个文件都包含单列。文件如下:

file1.txt
10032
19873
18326

file2.txt
10032
19873
11254

file3.txt
15478
10032
11254

等等。 每个文件的大小是不同的。 请告诉我如何找到所有这 100 个文件中常见的数字。

The same number appear only once in 1 file.

【问题讨论】:

  • 我注意到你没有select an answer,这里提供的解决方案都不适合你吗?

标签: awk text-processing comm


【解决方案1】:

无论同一个数字是否可以在 1 个文件中多次出现,这都会起作用:

$ awk '{a[$0][ARGIND]} END{for (i in a) if (length(a[i])==ARGIND) print i}' file[123]
10032

上面使用 GNU awk 来处理真正的多维数组和 ARGIND。如有必要,可以对其他 awk 进行简单的调整,例如:

$ awk '!seen[$0,FILENAME]++{a[$0]++} END{for (i in a) if (a[i]==ARGC-1) print i}' file[123]
10032

如果每个文件中的数字是唯一的,那么您只需要:

$ awk '(++c[$0])==(ARGC-1)' file*
10032

【讨论】:

  • 同一个数字在1个文件中只出现一次
  • 好吧,我提供的解决方案显然也适用于这种情况,但我添加了他对这种情况的微不足道的解决方案。
  • 非常简洁的“微不足道的解决方案”。我不得不停下来想一想。
【解决方案2】:

awk 来救援!

在所有文件中找到共同的元素(假设在同一个文件中是唯一的)

awk '{a[$1]++} END{for(k in a) if(a[k]==ARGC-1) print k}' files

计算所有出现次数并打印 count 等于文件数的值。

【讨论】:

    【解决方案3】:

    具有单个的文件?

    您可以使用 shell 对这些文件进行排序和比较:

    for f in file*.txt; do sort $f|uniq; done|sort|uniq -c -d
    

    最后一个-c 不是必需的,仅当您想计算出现次数时才需要。

    【讨论】:

    • 谢谢。这很有帮助。
    • sort * | uniq -c -d 似乎可以处理这个(数量的)数据。
    • 没有。如果您有多个字符串出现的文件,它将不起作用。
    • @A.N.你是对的,我错过了 OP 中没有删除限制,只是在 Ed 的回答中。
    【解决方案4】:

    一个使用 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
    

    【讨论】:

    • 而不是comm+sort 我建议使用grep -Fxf file1 file2
    • 关于如何选择其中一个文件作为初始 comms 的任何想法?比我的for ... break :D 更好?
    • 我确实尝试过类似的解决方案,但没有发布...不要忘记引用"$f"...来挑选,这将有助于了解文件名并使用 bash extglob.. .grep -Fxf file1.txt file2.txt &gt; f1 然后for f in !(file[12]).txt &lt;code&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多