【问题标题】:Deleting lines containing duplicated strings删除包含重复字符串的行
【发布时间】:2016-07-16 10:51:05
【问题描述】:

我总是感谢您的帮助。

我想删除第二列中包含重复字符串的行。

test.txt

658 invert_d2e_q_reg_0_/Qalu_ecl_zlow_e 0.825692
659 invert_d2e_q_reg_0_/Qalu_byp_rd_data_e[31]  0.825692
660 invert_d2e_q_reg_0_/Qalu_byp_rd_data_e[63]  0.825692
661 invert_d2e_q_reg_0_/Qalu_ecl_zhigh_e    0.825692
665 invert_d2e_q_reg_0_/Qalu_byp_rd_data_e[62]  0.825692
666 invert_d2e_q_reg_0_/Qalu_ecl_zlow_e 0.825692
668 invert_d2e_q_reg_0_/Qalu_ecl_zhigh_e    0.825692
670 invert_d2e_q_reg_0_/Qalu_ecl_zhigh_e    0.825692
673 invert_d2e_q_reg_0_/Qalu_ecl_zlow_e 0.825692
675 invert_d2e_q_reg_0_/Qalu_ecl_zhigh_e    0.825692
677 invert_d2e_q_reg_0_/Qalu_ecl_zhigh_e    0.825692
678 invert_d2e_q_reg_0_/Qalu_byp_rd_data_e[27]  0.825692
679 invert_d2e_q_reg_0_/Qalu_byp_rd_data_e[27]  0.8120
.
.
.

输出.txt

658 invert_d2e_q_reg_0_/Qalu_ecl_zlow_e 0.825692
659 invert_d2e_q_reg_0_/Qalu_byp_rd_data_e[31]  0.825692
660 invert_d2e_q_reg_0_/Qalu_byp_rd_data_e[63]  0.825692
661 invert_d2e_q_reg_0_/Qalu_ecl_zhigh_e    0.825692
665 invert_d2e_q_reg_0_/Qalu_byp_rd_data_e[62]  0.825692
678 invert_d2e_q_reg_0_/Qalu_byp_rd_data_e[27]  0.825692
.
.
.

我知道 sed 可以删除带有预定义特定字符串的行,但在我的情况下,我不能指望这些字符串是重复的。此外,重复的字符串可能超过 1000 个。

我使用“uniq”来完成这项工作,但这不起作用。 uniq –u –f 4 test.txt (-u 打印唯一的行。-f 跳过前 4 个字母。)

有没有办法用 sed/awk/perl 做到这一点?或者请更正我的 uniq 语义。

最好的,

在英

【问题讨论】:

  • man sort :查看-u 选项。您需要指定一个密钥,也许是 -k2 。祝你好运。
  • uniq 需要对已排序的输入进行操作。所以使用sort -k4 | uniq -u -f4
  • awk 使用数组应该可以快速完成这项工作。

标签: sed duplicates removeclass uniq


【解决方案1】:

这可能对你有用(GNU sed):

sed -r 'G;/^\S+\s+(\S+)\s+.*\n.*\1/!{P;s/\S+\s+(\S+)\s+.*/\1/;H};d' file

针对存储在保持空间 (HS) 中的该列的所有唯一值测试第二列,如果不存在,则打印该行并将其值存储在 HS 中。

或者使用排序:

sort -suk2,2 file | sort -nk1,1

【讨论】:

    【解决方案2】:

    Awk 可以用一个工具来做这件事,但这里是用 Bash 关联数组做这件事的相当直接的方法。循环遍历这些行并拉出第三列,如果没有关联数组条目,则回显该行并设置一个值,这样就不会再打印了。

    unset col3 && declare -A col3 && IFS=$(echo -en "\n\b") && for a in $(< test.txt); do 
     lncol3=$(echo "${a}" | tr '/' ' ' | awk '{print $3}')
     [[ -z "${col3["${lncol3}"]}" ]] && echo "${a}" && col3["${lncol3}"]=1
    done   
    

    【讨论】:

    • 这是一个有用的技术,但sort -uk2,2 test.txt|sort 可以简洁地完成工作。
    【解决方案3】:
    awk '!seen[$0]++' input.txt > output.txt
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2016-01-05
    • 2020-02-04
    • 2020-09-27
    • 2014-04-16
    • 2022-11-07
    • 1970-01-01
    • 2022-08-11
    相关资源
    最近更新 更多