Regex 将两个文件与未排序的AWK进行比较

Regex 将两个文件与未排序的AWK进行比较,regex,awk,Regex,Awk,我有两个这样的文件: Animal Food cat fish Dog meet cow grass Animal Food Price cat fish 45 Dog meet 47 awk 'NR==FNR {$1 = $2; next} {print}' file1 file2 第二个文件: Animal Food Price cat fish 45 Dog meet 47 Got grass 74 我只想根据第一列和第二列比

我有两个这样的文件:

Animal Food
cat    fish
Dog    meet
cow    grass
Animal Food Price
cat    fish  45
Dog    meet  47
awk 'NR==FNR {$1 = $2; next} {print}' file1 file2
第二个文件:

Animal Food Price
cat    fish  45
Dog    meet  47
Got    grass 74
我只想根据第一列和第二列比较这两个文件,如下所示:

Animal Food
cat    fish
Dog    meet
cow    grass
Animal Food Price
cat    fish  45
Dog    meet  47
awk 'NR==FNR {$1 = $2; next} {print}' file1 file2
通常,我将使用
JOIN
函数执行此操作,但在这种情况下,排序是不可能的。我需要的结果与文件1的顺序完全相同 然后我用AWK做了如下尝试:

Animal Food
cat    fish
Dog    meet
cow    grass
Animal Food Price
cat    fish  45
Dog    meet  47
awk 'NR==FNR {$1 = $2; next} {print}' file1 file2
但它会产生一些重复的结果和不同的顺序。

您可以使用:

awk '{k = $1 FS $2} NR == FNR {map[k]=$3; next} k in map{print $0, map[k]}' f2 f1

实际上,您可以使用连接和排序来完成此操作,您只需修饰输入以使用原始行号连接,这样您就可以在输出中再次对这些行号进行排序:

$ cat tst.sh
#!/usr/bin/env bash

encode() {
    awk '{print $1 SUBSEP $2, NR, $0}' "${@:--}" |
    sort
}

decode() {
    sort -k2,2n "${@:--}" |
    awk '{sub("^([^[:space:]]+[[:space:]]+){"NF/2+1"}","")} 1'
}

join <(encode "$1") <(encode "$2") | decode

在现实生活中,我只会使用@anubhava的方法,当然,除非我遇到内存问题或类似问题,否则以上只是为了演示另一种方法。

因为输出顺序是来自文件1而不是来自文件2的顺序,这一点对您很重要,您应该提供一个示例,其中两个文件之间的顺序不同,因此当我们使用它测试潜在解决方案时,我们可以判断它是否有效。