在Shell中从CSV中删除重复项
我在下面的文件中寻找帮助。 第1列中的客户端可以是一个或多个组的一部分。 它们的状态可以是失败、成功或中断。 我只想要那些没有任何成功输入的客户端 范例 我的档案如下在Shell中从CSV中删除重复项,shell,sh,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 s
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
的数组,其中数组索引是第一列,并且只打印“good”数组中不存在条目的“bad”条目
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
说明:
sed
生成具有成功状态的“x”列表(在任何组中)。grep
将从status.csv
中删除(因为-v
)(-f-
表示grep
从stdin
中获取模式(等于sed的stdout
)。csv?或者制表符或空格分开?您尝试了什么?为什么输出中的b group2没有失败?还是其他?每个组只有一行随机匹配吗?@Shawn其空格分开。@Shawn-因为b组2在最后一行中失败了。谢谢你的帮助,Freddy,但在你的脚本中,我面临的问题是,如果客户在其他组中成功了,那么它将显示为失败。但我希望,如果一个客户机在同一组或任何其他组中获得成功,它就不应该出现在输出中。我只想要那些有一个或多个条目失败或中断而没有成功的客户。Freddy,我用一个新的例子更新了我的问题。我只希望输出中的客户在任何一个组中一次也不成功。谢谢@Freddy的帮助,但我面临着同样的问题,如果客户在任何其他组中成功,那么它不会过滤,但如果它在同一组中成功,那么它会过滤。我希望如果客户机在任何组中获得成功,则它不应在输出中–我已使用服务器上的原始文件更新了我的问题。我在脚本中将successful
替换为successfued
。感谢UZSOLT的帮助,但在您的脚本中,我面临的问题是,如果客户机在其他组中获得成功,那么它将显示为失败。但我希望,如果一个客户机在同一组或任何其他组中获得成功,它就不应该出现在输出中。我只想要那些单个或多个条目失败或中断而未成功的客户端。谢谢@Uzsolt的帮助,但我面临着同样的问题,如果客户端在任何其他组中成功,则它不会对其进行筛选,但如果它在同一组中成功,则会进行筛选。我想如果客户在任何一个组中成功,那么它就不应该在组中output@GURUSINGH成功->成功请不要多次编辑您的问题,因为不可能回答它。请准确。谢谢@uzsolt。我现在已经分类了。请让我知道我们是否可以在Powershell中实现同样的目标,我也不知道Powershell。也许这应该是另一个问题。
sed -n '/succeeded/ s,\(.*\) .* succeeded$,\1,p' status.csv | grep -v -f - status.csv