【问题标题】:AIX - awk display first occurence of each matchAIX - awk 显示每个匹配项的第一次出现
【发布时间】:2017-09-09 06:07:41
【问题描述】:

假设我有一个名为 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 机器。

任何帮助表示赞赏。

【问题讨论】:

    标签: bash unix awk scripting aix


    【解决方案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
    

    【讨论】:

    • 像魅力一样工作。我这样使用它,所以“SUCCESS”出现在哪里并不重要awk '/SUCCESS/ && !a[$2$3]++{print $2,$3}' RESULTS.txt
    • @EdMorton,说得好。我从分隔符a[$2,$3] 开始,但过早地简化为a[$2$3]。返回到相关的“关键”
    【解决方案2】:

    排序方法:

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

    输出:

    JON DOE
    JANE DOE
    

    【讨论】:

    • \; 有什么用?此外,该脚本不会产生您所说的输出(提示:缺少, 和错误的排序顺序)。
    【解决方案3】:

    按要求看不到数组:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多