Как сравнить два файла построчно, независимо от порядка? - PullRequest
3 голосов
/ 15 мая 2019

У меня есть два файла, и я хочу проверить, существует ли каждая строка в этом файле. Однако иногда порядок слов после второго слова в каждой строке отличается. Это нормально, потому что меня интересуют только пропущенные / дополнительные слова после первых двух слов / столбцов.

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 ]

2 голосов
/ 15 мая 2019

С 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 заданный ключ указан 2 раза, а для 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 голос
/ 15 мая 2019

Питон твой друг! Вы можете начать с чего-то вроде этого:

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()
...