从 Shell 中的 CSV 中删除重复项

Removing Duplicates from CSV in Shell

我正在以下文件中寻求帮助。 第 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

您可以为 "good" 和 "bad" 条目维护两个数组 awk,其中数组索引是第一列,并且只打印 "bad" "good" 数组中不存在任何条目。

awk '
  =="succeeded"{ good[] }  # we only need the index here
  =="failed" || =="interrupted"{
    if ( in bad){ 
      bad[]=bad[] ORS [=10=] # append this line to existing entry
    } else {
      bad[]=[=10=]             # save the line
    }
  }
  END{
    for (i in bad)
      if (!(i in good))print bad[i]
  }
' file
sed -n '/succeeded/ s,\(.*\) .* succeeded$,,p' status.csv | grep -v -f - status.csv

解释:sed 生成具有成功状态(在任何组中)的 'x' 列表。 grep 将从 status.csv 中删除(因为 -v)它们(-f - 意味着 grepstdin 中获取模式(等于 sed 的 stdout)).