第一场比赛 - awk

Eng*_*ng7 5 awk text-processing

考虑具有值的文件:

foo
boo
too
Run Code Online (Sandbox Code Playgroud)

还有一个:

foo,1
foo,2
boo,1 
soo,1
Run Code Online (Sandbox Code Playgroud)

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

foo,1
boo,1
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 9

怎么样

$ awk -F, 'NR==FNR {a[$1]; next} $1 in a {print; delete a[$1]}' file1 file2
foo,1
boo,1 
Run Code Online (Sandbox Code Playgroud)


ded*_*sdi 6

著名习语的变体。

awk -F, 'FNR==NR{a[$1]=1;next} a[$1]++==1' file1 file2
Run Code Online (Sandbox Code Playgroud)

更新

正如@dave_thompson_085 指出的那样,soo,#第二个文件中可能有多个,因此第二个文件a[$1]++==1为真。他还提供了几种修复方法:

awk -F, 'FNR==NR{a[$1]=1;next} !--a[$1]' file1 file2
Run Code Online (Sandbox Code Playgroud)

  • 这将错误地包含 `soo,2`(如果存在)。往另一个方向走:`FNR==NR{a[$1]=1;next} a[$1]--==1 # or !--a[$1]` (2认同)