2016-03-29 32 views
0

私はいつもあなたの助けに感謝します。重複した文字列を含む行の削除

2番目の列に重複した文字列を含む行を削除したいと思います。

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

output.txtと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 
. 
. 
. 

私はsedのは、事前に定義された特定の文字列と行を削除することができます知っているが、私のケースでは、私は文字列が重複している期待することができませんでした。また、複製された文字列は1000以上である可能性があります。

"uniq"を使用してこのジョブを実行しましたが、これは機能しません。 UNIQ -u -f 4 test.txtの (-uは、ユニークな行を表示します。最初の4つの文字をスキップ-f。)

のsed/awkは/ perlのでこれを行うにはどのような方法がありますか?または、私のユニークなセマンティクスを修正してください。

ベスト、

Jaeyoung

+0

'man sort':' -u'オプションを見てください。キーを指定する必要があります。多分 '-k2'です。がんばろう。 – shellter

+1

'uniq'はソートされた入力に作用する必要があります。だから 'sort -k4 | uniq -u -f4' – Will

+1

配列を使った 'awk'はこの素早い作業をすべきです。 –

答えて

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 
+0

優雅なやり方。 +1 –

0

awkは1つのツールでこれを行うが、ここではBashの連想配列でそれを行うにはかなりまっすぐ進むべき道であるだろう。行をループして3列目を抜き出します。連想配列の項目がない場合は、行をエコーし​​て、それ以上印刷されないように値を設定します。

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 
+0

これは知っておくと便利なテクニックですが、 'sort -uk2,2 test.txt | sort'は仕事を簡潔にします。 –

関連する問題