Bus errorとSegmentation faultに困ったら見るブログ

物理の研究者による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

【シェルコマンド】ある行の整数部分が重複したものだけを取り除きたいとき

まずデータの紹介

これがhoge1.txt

3333 0.840188
4444 0.394383
1111 0.783099
1111 0.79844
3333 0.911647
3333 0.197551
4444 0.335223
これがhoge2.txt
3333.0 0.840188
4444.2 0.394383
1111.1 0.783099
1111.2 0.79844
3333.0 0.911647
3333.5 0.197551
4444.9 0.335223
hoge1.txtは$1が整数だけど、
hoge2.txtは$1が小数なのでhoge1.txtと同じ方法では重複を判別できない


ググったらまずは「uniqを使うんや」という知見を得たのでやってみた。

まずuniqコマンドの使い方は、

% uniq hoge1.txt
3333 0.840188
4444 0.394383
1111 0.783099
1111 0.79844
3333 0.911647
3333 0.197551
4444 0.335223
で、連続して重複した行を1つにまとめてくれるはずなのだが、
行全体の一致を調べてくれているので、この場合は役に立たない
%uniq -c hoge1.txt
で、一致している行には数字を打ってくれる機能をうまく使えばなんとかできる気がしたけど、
アフォなのでパス

また、連続していない重複は消してくれないので
もし連続していない別の列との重複も消したい場合は事前にsortしておく必要がある


■ 参考 : uniq コマンド





googleで「sort 重複 -uniq」で調べたらやっと出てきた・・・

■ 参考 : ソートしないで重複行を削除する

awk '!a[$0]++' FILE
でいいらしい
説明は参考リンクにあるのでパス(正直わからんちん)


このコマンドをそのままこれそのまま打っても ! がダメっぽい
シェルスクリプトとかにすればいける?

% awk '\!a[$1]++' hoge1.txt
3333 0.840188
4444 0.394383
1111 0.783099
で、! をエスケープすればたぶんOK

一応、これでhoge1.txtの$1から重複してるものを取り除くことはできた
他の行の重複を調べたいときは$1を置き換えればOK


他には、$2が大きいものから残しているようにしたかったら

% sort -k2 -r -g hoge1.txt | awk '\!a[$1]++'
3333 0.911647
1111 0.79844
4444 0.394383
ただし、$1の並び順はめちゃくちゃになるけど

上記のソートで sort -k -r -nと書いていたけど、nオプションは整数を並べ替えるときに使うっぽい
符号を含んだ実数(+1e-5とか-1e-13)とかは-gオプションを付けてソートする




次にhoge2.txtの$1の整数部分を取り出してみる

% awk '{print int($1), $1, $2}' hoge2.txt

または

% awk '{printf "%d %f %f\n", $1, $1, $2}' hoge2.txt

1つめの方法を見つけたときに、ほほ〜と思ったけど、2つめのprintfでごり押した方が早かったわ・・・・

これで、データを整数型にできれば、あとはhoge1.txtと同様にして重複部分を取り除けるわー



ランキング参加中です

↓クリックしていただけると嬉しいです〜