击.从多个文件中获取交集

Jon*_*ono 13 bash shell awk command-line grep

那么让我解释一下这个:

我有一个名为tags的目录,每个标签都有一个文件,如:

tags/
    t1
    t2
    t3
Run Code Online (Sandbox Code Playgroud)

在每个标记文件中都有如下结构:

<inode> <filename> <filepath>
Run Code Online (Sandbox Code Playgroud)

当然,每个标记文件都有一个包含该标记的许多文件的列表(但文件只能出现在一个标记文件中一次).并且文件可以在多个标签文件中.

我想要做的就是调用命令

tags <t1> <t2> 
Run Code Online (Sandbox Code Playgroud)

让它以一种很好的方式列出标记为t1和t2的文件.

我现在的计划是制作临时文件.基本上将t1的整个文件输出到其中.然后在t2中遍历每一行并对文件执行awk.并继续这样做.

但我想知道是否有人有任何其他方式.我对awk,grep等不太熟悉.

jks*_*hah 17

您可以尝试使用comm实用程序

comm -12 <t1> <t2>
Run Code Online (Sandbox Code Playgroud)

comm 使用followinng选项的适当组合可以对文件内容的不同设置操作有用.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)
Run Code Online (Sandbox Code Playgroud)

这假定<t1><t2>排序.如果没有,他们应该首先排序sort

  • 使用 Linux 十多年后,TIL `comm`。谢谢你! (2认同)
  • @AdamLiss欢迎你.我从你的解决方案中学习了`uniq`的`-d`选项.谢谢你的回报.归功于SO知识共享.干杯! (2认同)

Ada*_*iss 16

你能用吗?

sort t1 t2 | uniq -d
Run Code Online (Sandbox Code Playgroud)

这将合并两个文件,对它们进行排序,然后仅显示多次出现的行:即两个文件中出现的行.

这假定每个文件中不包含重复项,并且inode在特定文件的所有结构中都是相同的.