【问题标题】:Remove lines partially matching other lines in a file删除部分匹配文件中其他行的行
【发布时间】:2015-06-15 12:23:21
【问题描述】:

我在 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 列总是相似的,我总是想删除比较两者之间的最短线。

谢谢!

【问题讨论】:

  • 这不是问题,只是代码请求。请阅读How to Ask
  • @TomFenech 显然,只要答案对某人有帮助,就允许代码请求。这就是为什么没有密切的原因。
  • 伙计们,这不是代码请求,而是关于如何检查一行是否部分匹配另一行。关于如何做到这一点的一般想法就足够了。
  • 相似的行总是在一起吗?它们总是第 n 和 n+1 行,还是可以是第 n+1 和 n+2 行?
  • 什么构成部分,1 个字母,10 个字母?这是一个想法,查找基本的 awk 和 sed 命令,尝试解决并返回您的尝试。

标签: bash shell awk sed


【解决方案1】:

这是使用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"

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 2023-03-10
    • 2021-12-12
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多