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

问题描述 投票:0回答:1

我在两个目录中有四个文件: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
shell unix terminal
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.