我在两个目录中有四个文件:1.txt
和2.txt
在一个目录中,3.txt
和4.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
我有一些希望足够接近的东西 - 否则你可以稍微用它来使它靠近它。
因此,如果您使用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