删除包含重复字符串的行

时间:2016-03-29 03:28:20

标签: sed duplicates removeclass uniq

我总是感谢你的帮助。

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

的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
.
.
.

output.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语义。

最佳,

Jaeyoung

2 个答案:

答案 0 :(得分: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:

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

答案 1 :(得分:0)

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