我有两个文件,我想检查该文件中的每一行是否存在。但是,有时每行中第二个单词之后的单词顺序是不同的。可以,因为我只对前两个单词/列之后的丢失/其他单词感兴趣。
file_A:
foobar A a ab c bd hd
bar B a c jd sm sldkjn
baz C boo abd
file_B:
foobar A a c bd hd ab
baz C abd boo
bar B c a jd sm sldkjn
在上面的示例中,根据我的标准,这两个文件都不错。
起初我尝试
$ sort -u file_A > outA
$ sort -u file_B > outB
$ diff outA outB
这样就不会考虑行顺序。 但是,它考虑到了每行中的单词顺序。
如何忽略第二列之后每一行的单词顺序?
答案 0 :(得分:2)
使用GNU awk表示“ sorted_in”:
$ cat tst.awk
BEGIN { PROCINFO["sorted_in"] = "@val_str_asc" }
{
key = $1 FS $2
$1 = $2 = ""
split($0,f)
for (i in f) {
key = key FS f[i]
}
keys[key]
}
NR==FNR { a[key]++; next }
{ b[key]++ }
END {
diff = 0
for (key in keys) {
if (a[key] > b[key]) {
print "<", key
diff = 1
}
else if (b[key] > a[key]) {
print ">", key
diff = 1
}
}
exit diff
}
每个键计数和以后的数字比较对于确定以下情况是必要的:例如,file_A列出了给定键两次,而file_B仅列出了一次,因此应该将文件报告为不同。例如:
$ cat file_A
foobar A a ab c bd hd
bar B a c jd sm sldkjn
baz C boo abd
baz C boo abd
$ cat file_B
foobar A a c bd hd ab
baz C abd boo
bar B c a jd sm sldkjn
$ awk -f tst.awk file_A file_B
< baz C abd boo
答案 1 :(得分:1)
Python是您的朋友! 您可以从这样的内容开始:
with open(path1, 'r') as file1:
with open(path2, 'r') as file2:
for line in file1:
words = line.split(" ")
for line in file2:
for word in words:
if word not in line:
doSomething()
else:
doSomethingElse()