删除部分匹配文件中其他行的行

时间:2015-06-15 12:23:21

标签: bash shell awk sed

我在 input.txt

中有以下几行
    client_citic_plat_fix44;CITICHK;interbridge_ulnet_se_eqx
    client_citic_plat_fix44;CITICHK;interbridge_ulnet_se_eqx;CITICHK;interbridge_hk_eqx
    client_dkp_crd;DELIVERTOCOMPID;DESTINATION
    client_dkp_crd;NORD;interbridge_fr
    client_dkp_crd;NORD;interbridge_fr;broker_nordea_2
    client_dkp_crd;AVIA;interbridge_fr
    client_dkp_crd;AVIA;interbridge_fr;interbridge_ld
    client_dkp_crd;SEBAP;interbridge_fr
    client_dkp_crd;SEBAP;interbridge_fr;broker_seb_ss_thl
    client_epf_crd;DELIVERTOCOMPID;DESTINATION

我需要一些bash(awk / sed)脚本来删除与其他部分相似的行。期望的输出应该是:

    client_citic_plat_fix44;CITICHK;interbridge_ulnet_se_eqx;CITICHK;interbridge_hk_eqx
    client_dkp_crd;DELIVERTOCOMPID;DESTINATION
    client_dkp_crd;NORD;interbridge_fr;broker_nordea_2
    client_dkp_crd;AVIA;interbridge_fr;interbridge_ld
    client_dkp_crd;SEBAP;interbridge_fr;broker_seb_ss_thl
    client_epf_crd;DELIVERTOCOMPID;DESTINATION

第1,2和3列始终相似,我总是希望删除两者之间的最短线。

谢谢!

1 个答案:

答案 0 :(得分:0)

以下是使用grepsed的解决方案:

#!/bin/bash
file="filepath"
while IFS= read -r line;do
 (($(grep $line "$file" -c)>1)) && sed -i "/^$line$/d" "$file"
done <"$file"

注意:这将替换您的文件。

要不替换您的文件并将输出放到另一个文件,您可以这样做:

#!/bin/bash
infile="infilepath"
outfile="outfilepath"
cp "$infile" "$outfile"
while IFS= read -r line;do
 (($(grep $line "$infile" -c)>1)) && sed -i "/^$line$/d" "$outfile"
done <"$infile"