shell - 在 Shell 中从 CSV 中删除重复项

标签 shell sh

我正在以下文件中寻求帮助。 第 1 列中的客户端可以属于一个或多个组。 它们的状态可以是失败、成功或中断。 我只想要那些没有成功进入的客户。

示例

我的文件如下

RBCSREXC04 AUTO_RERUN_RBC_DAILY succeeded
RBCSRTM03 AUTO_RERUN_RBC_DAILY succeeded
RBCVMAPPPROD01 AUTO_RERUN_RBC_DAILY succeeded
RBCVVMAPPDEV02 AUTO_RERUN_RBC_DAILY succeeded
E6-RBC-SQL-06 AUTO_RERUN_RBC_DAILY succeeded
E6-ODI-Prod-01 AUTO_RERUN_RBC_DAILY succeeded
GSIERBC2004 AUTO_RERUN_RBC_DAILY succeeded
GSIERBC3008 AUTO_RERUN_RBC_DAILY succeeded 
RBCSRTM03 D_RBC_VM_DUBLIN_E6 failed
RBCSREXC04 D_RBC_VM_DUBLIN_E6 failed
GSIERBC3008 D_RBC_VM_DUBLIN_E6_1 interrupted
E6-ODI-Prod-01 D_RBC_VM_DUBLIN_E6_1 failed
RBCVVMAPPDEV02 D_RBC_VM_DUBLIN_E6_1 failed
E6-RBC-SQL-06 D_RBC_VM_DUBLIN_E6 failed
RBCVMAPPPROD01 D_RBC_VM_DUBLIN_E6 failed
RBCSRCV01 D_RBC_VM_DUBLIN_E6 failed

以下是预期输出

RBCSRCV01 D_RBC_VM_DUBLIN_E6 failed

最佳答案

您可以使用awk维护两个数组,分别表示“好”和“坏”条目,其中数组索引是第一列,并且仅打印“坏”条目,其中没有条目“好”数组存在。

awk '
  $3=="succeeded"{ good[$1] }  # we only need the index here
  $3=="failed" || $3=="interrupted"{
    if ($1 in bad){ 
      bad[$1]=bad[$1] ORS $0 # append this line to existing entry
    } else {
      bad[$1]=$0             # save the line
    }
  }
  END{
    for (i in bad)
      if (!(i in good))print bad[i]
  }
' file

关于shell - 在 Shell 中从 CSV 中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61140286/

相关文章:

java - 如何在 java 中运行 sh 命令并分配选项

linux - 合并两个文件夹并保持文件同名

linux - 循环脚本,重定向到文件

Linux 上的 Java - 打开文件管理器

linux - 为什么我的 shell 脚本退出?

linux - 强制 sh shell 使用外部函数而不是内置函数

bash - 如何将多行连接成一个字符串

bash -/bin/sh : No such file or directory when setting a docker-compose entrypoint

android - 获取安卓:versionName with shell command

linux - 如何发送整数作为参数?