AIX - awk显示每个匹配的第一次出现

时间:2017-04-13 08:09:52

标签: bash unix awk scripting aix

假设我有一个名为RESULTS.txt的文件,其中包含以下内容:

SUCCESS JON DOE
SUCCESS JON DOE
SUCCESS JANE DOE
FAILURE JON DOE
FAILURE JANE DOE

我现在需要做的是从包含“SUCCESS”一词的每一行中“提取”名称(JON DOE或JANE DOE)。我用awk想出来了: awk '/SUCCESS/ {print $2 $3}'\; RESULTS.txt这给了我以下输出:

JON DOE
JON DOE
JANE DOE

提取名称的工作正常。我现在的问题是我需要每个匹配,或者在这个上下文中每个名称,只需要一次。换句话说:我想要一个产生以下输出的命令:

JON DOE
JANE DOE

我知道一种可能性是编写脚本,例如,将每个匹配存储到一个数组中。然后我可以循环遍历数组搜索,如果已经有一个具有相同名称的条目,则在插入新条目之前。

但我正在寻找的是一种精益求解的解决方案来解决这个问题,而无需使用数组或写入文件。

我正在使用AIX机器。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:1)

awk 方法:

awk '$1=="SUCCESS" && !a[$2,$3]++{print $2,$3}' RESULTS.txt

输出:

JON DOE
JANE DOE

使用 sed + uniq 管道的替代方法:

sed -n 's/SUCCESS \(.*\)/\1/p' RESULTS.txt | uniq

答案 1 :(得分:0)

排序 方法:

awk '/SUCCESS/ {print $2 " " $3}' RESULTS.txt | sort -ur

输出:

JON DOE
JANE DOE

答案 2 :(得分:0)

根据要求,看不到阵列:

$ awk 'sub(/^SUCCESS /,"") && $0!=prev{print; prev=$0}' file
JON DOE
JANE DOE