从 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 -
意味着 grep
从 stdin
中获取模式(等于 sed 的 stdout
)).
我正在以下文件中寻求帮助。 第 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 -
意味着 grep
从 stdin
中获取模式(等于 sed 的 stdout
)).