我在两个目录中有四个文件: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
答案 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