比较两个不同目录中的文件内容

时间:2017-12-19 14:07:05

标签: shell unix terminal

我在两个目录中有四个文件:1.txt2.txt位于一个目录中,3.txt4.txt位于另一个目录中。我想比较这些文本文件中以“查询”一词开头的第一个模式,并匹配两个不同目录中存在的文件。 我该怎么办?

示例:

的1.txt

ABC
Query : JKLTER

2.txt

ABC
Query : PCA

3.txt

Query :JKLTER
XYSH
Query : ABC

4.txt

GFHHH

使用命令我可以根据匹配的第一个模式(以Query开头)从目录中派生这两个文件。

Output :
Matched files : 1.txt 3.txt

1 个答案:

答案 0 :(得分:0)

我有一些希望足够接近的东西 - 否则你可以稍微用它来使它更接近。

因此,如果您使用GNU awk在目录中的所有文件中查找包含单词Query的第一行,然后打印该行上的最后一个单词以及当前文件的名称,您将获得第一个目录d1

awk -F'[ :]*' '/Query/{print $NF,FILENAME; nextfile}' d1/*txt
JKLTER d1/1.txt
PCA d1/2.txt

这是第二个目录d2

awk -F'[ :]*' '/Query/{print $NF,FILENAME; nextfile}' d2/*txt
JKLTER d2/3.txt

然后,您可以将每个命令的输出传递给join,以使其连接第一个字段匹配的行:

join <(awk -F'[ :]*' '/Query/{print $NF,FILENAME; nextfile}' d1/*txt) <(awk -F'[ :]*' '/Query/{print $NF,FILENAME; nextfile}' d2/*txt)

<强>输出

JKLTER d1/1.txt d2/3.txt

您可以在运行awk之前更改为每个目录来删除前导目录:

join <(cd d1; awk -F'[ :]*' '/Query/{print $NF,FILENAME; nextfile}' *txt) <(cd d2; awk -F'[ :]*' '/Query/{print $NF,FILENAME;nextfile}' *txt) 

<强>输出

JKLTER 1.txt 3.txt

你可以像这样摆脱join使用的公共字段:

join <(...) <(...) | awk '{$1="";print}'

<强>输出

1.txt 3.txt

如果您只有文本文件而且每个子目录中没有其他内容,并且在Query后面的冒号后面实际上有空格,我的解决方案可以简化为:

join <(cd d1; awk '/Query/{print $NF,FILENAME; nextfile}' *) <(cd d2; awk '/Query/{print $NF,FILENAME;nextfile}' *) | awk '{print $2,"matches",$3}'

<强>输出

1.txt matches 3.txt