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的顺序,这一点对您很重要,您应该提供一个示例,其中两个文件之间的顺序不同,因此当我们使用它测试潜在解决方案时,我们可以判断它是否有效。