Bash:比较两个文件,并用';等级制度';

Bash:比较两个文件,并用';等级制度';,bash,file,sorting,awk,comm,Bash,File,Sorting,Awk,Comm,基本上,我需要比较两个文件 file1.txt 1 a 2 b 3 c 44 d file2.txt 11 a 123 a 3 b 445 d 为了显示文件1中的唯一行,我在这两个文件的“sort-u”之后使用了“comm-23”命令。此外,我想使文件2中的“11a”“123a”成为文件1中“1a”的子集,类似地,“445d”是“44d”的子集。这些子集被视为与其超集相同。所以期望的输出是 2 b 3 c 我是初学者,我的循环太慢了。。。这是我的代码 comm -23 <( awk

基本上,我需要比较两个文件

file1.txt
1 a
2 b
3 c
44 d

file2.txt
11 a
123 a
3 b
445 d
为了显示文件1中的唯一行,我在这两个文件的“sort-u”之后使用了“comm-23”命令。此外,我想使文件2中的“11a”“123a”成为文件1中“1a”的子集,类似地,“445d”是“44d”的子集。这些子集被视为与其超集相同。所以期望的输出是

2 b
3 c
我是初学者,我的循环太慢了。。。这是我的代码

comm -23 <( awk {print $1,$2}' file1.txt | sort -u ) <( awk '{print $1,$2}' file2.txt | sort -u  ) >output.txt
array=($( awk -F ',' '{print $1}' file1.txt ))
for i in "${array[@]}";do
awk -v pattern="$i" 'match($0, "^" pattern)' output.txt > repeat.txt
done
comm -23 <( cat output.txt | sort -u ) <( cat repeat.txt | sort -u )

对于阵列阵列,使用GNU awk:

$ cat tst.awk
NR==FNR {
    vals[$2][$1]
    next
}
$2 in vals {
    for (i in vals[$2]) {
        if ( index(i,$1) == 1 ) {
            next
        }
    }
}
{ print FNR, $0 }

$ awk -f tst.awk file2 file1
2 2 b
3 3 c

通过循环向我们展示您当前的解决方案,我们可以对其进行改进。很酷,我已编辑
$ cat tst.awk
NR==FNR {
    vals[$2][$1]
    next
}
$2 in vals {
    for (i in vals[$2]) {
        if ( index(i,$1) == 1 ) {
            next
        }
    }
}
{ print FNR, $0 }

$ awk -f tst.awk file2 file1
2 2 b
3 3 c