如何不按顺序逐行比较两个文件?

时间:2019-05-14 21:50:27

标签: python shell awk diff ksh

我有两个文件,我想检查该文件中的每一行是否存在。但是,有时每行中第二个单词之后的单词顺序是不同的。可以,因为我只对前两个单词/列之后的丢失/其他单词感兴趣。

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

这样就不会考虑行顺序。 但是,它考虑到了每行中的单词顺序。

如何忽略第二列之后每一行的单词顺序?

2 个答案:

答案 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()