我总是感谢你的帮助。
我想删除第二列中包含重复字符串的行。
的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
答案 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