![](/img/trans.png)
[英]bash/awk script to compare the content all the files in two different folders
[英]Compare the content of two different files
例如,`file1.txt,仅包含变量:
a
b
d
c
file2.txt
包含<
,变量和路径:
< a /x/y/1.c
< c /x/d/7.h
< f /x/c/6.s
< b /x/v/8.mk
< t /x/1.h
< d /x/5.so
应该将file1.txt
变量与file2.txt
进行比较。 如果找到匹配项,则应从file2.txt
打印完整的变量和路径。
预期产量:
< a /x/y/1.c
< b /x/v/8.mk
< d /x/5.so
< c /x/d/7.h
我尝试使用comm -3 file1.txt file2.txt
,但是它无法有效工作。
diff
无法用于我的情况。
如果file2.txt中的行不是以<开头,则可以使用此;
join <(sort file1.txt) <(sort file2.txt)
如果以<char开头,则可以使用它;
join -11 -22 <(sort file1.txt) <(sort file2.txt)
例如;
user@host:/tmp$ join -11 -22 <(sort file1.txt) <(sort file2.txt)
a < /x/y/1.c
b < /x/v/8.mk
c < /x/d/7.h
d < /x/5.so
-11表示file1.txt和第一列,-22表示file2.txt和第二列(在“ <”字符之后)
当键不在路径中任何位置时的解决方案:尝试此操作
cat file2.txt | grep -f file1.txt
根据需要切换文件名。
您要求外壳,但我会通过python回答
import sys
with open(sys.argv[1], "r") as f:
d = dict((e.rstrip().split()[1], e) for e in f)
with open(sys.argv[2], "r") as f:
for e in f:
e = e.rstrip()
if e in d:
print(d[e], end="")
如果将其保存到run.py
,则可以这样调用它:
python3 run.py file2.txt file1.txt > output.txt
与排序解决方案相比,它还保留了file1.txt
的顺序,但将第二个文件加载到内存中。
AWK对这些事情有好处:
$ awk 'NR == FNR {keys[$0] = 1; next}keys[$2]' file1.txt file2.txt
< a /x/y/1.c
< c /x/d/7.h
< b /x/v/8.mk
< d /x/5.so
基本上,file1.txt缓存在keys
数组中。 然后,如果列2在所述数组中,则打印file2的每一行:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.