python - 如何不考虑顺序逐行比较两个文件?

标签 python shell awk diff ksh

我有两个文件,我想检查该文件中的每一行是否都存在。但是,有时每行中第二个单词之后的单词顺序不同。没关系,因为我只对前两个词/列之后的缺失/附加词感兴趣。

文件_A:

    foobar A a ab c bd hd
    bar B a c jd sm sldkjn
    baz C boo abd

文件_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

这种方式不考虑行顺序。 但是,它会考虑每一行的词序。

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

最佳答案

对于“sorted_in”使用 GNU awk:

$ 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

关于python - 如何不考虑顺序逐行比较两个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56139107/

相关文章:

python - subprocess.Popen 没有正确转义命令行参数?

java - 如何在 Python 中生成 long 类型的 UUID(由 java 程序使用)?

linux - 如何在shell脚本中使用ftp制作远程文件夹的镜像

shell - 如何使用 awk 或 sed 将每个单独出现的单词替换为其他单词?

bash - 使用 cut -d 在 awk if 条件中提取整行

python - Fuzzywuzzy 在 Python 中匹配来自不同数据帧的多列

python - 使用python检查字典中是否存在键时出现AttributeError

regex - 如何在 bash 中替换字符串中的模式

awk - 如何使用 AWK 删除包含特定标题的所有列

linux - awk 只在 while 循环内打印第一行,除非回显,理论解释