第一场比赛 - awk

第一场比赛 - awk

考虑文件具有值:

foo
boo
too

和另一个:

foo,1
foo,2
boo,1 
soo,1

如何从第二个文件中仅获取第一个匹配项,其中输出为:

foo,1
boo,1

答案1

怎么样

$ awk -F, 'NR==FNR {a[$1]; next} $1 in a {print; delete a[$1]}' file1 file2
foo,1
boo,1 

答案2

著名习语的变体。

awk -F, 'FNR==NR{a[$1]=1;next} a[$1]++==1' file1 file2

更新

soo,#正如 @dave_thompson_085 指出的,第二个文件中可能有多个,这导致a[$1]++==1第二个文件也是如此。他还给出了几种解决方法:

awk -F, 'FNR==NR{a[$1]=1;next} !--a[$1]' file1 file2

答案3

实际上不是awk,但它有效。我想它可以轻松扩展。

#!/usr/bin/env bash

while IFS= read -r line; do
    grep -m1 "$line" "$2"
done < "$1"
$ ./script.sh file1 file2

逐行阅读https://stackoverflow.com/questions/10929453/read-a-file-line-by-line-assigning-the-value-to-a-variable
然后它只是“在 file2 中查找与行内容的第一个匹配项”

答案4

我也使用过 awk 但方法不同

命令

awk -F "," 'NR==FNR{a[$1];next}($1 in a){print $0}' file1.txt file2.txt| awk -F "," '{if (!seen[$1]++)print }'

输出

awk -F "," 'NR==FNR{a[$1];next}($1 in a){print $0}' file1.txt file2.txt| awk -F "," '{if (!seen[$1]++)print }'
foo,1
boo,1 

相关内容