Help us understand the problem. What is going on with this article?

uniqコマンドで「指定したフィールドで重複をチェック」したい

uniq とは

uniq は、ある入力から行を読み込み、重複した行を取り除いて出力するコマンドです。 例えば以下のようなinput.txtがあったとします。

$ cat input.txt
aaa
aaa
bbb

こいつにuniqをかけると重複行(aaa)が取り除かれます。ただしあらかじめソートされている必要があります。

$ cat input.txt | uniq
aaa
bbb

やりたいこと

このようなinput2.txtがあったとします。

$ cat input2.txt
tanaka taro
tanaka ichiro
sato taro

CSV的な感じですね。スペース区切りで氏名が載っているようです。今、uniqを使って名字が重複している行を取り除き、以下のような出力を得たいとします。

$ cat input2.txt | uniq --なんらかのオプション
tanaka taro
sato taro

また、下の名前でも重複をチェックしたり、もっと言うと項目がたくさんあるCSVファイルなどで指定したフィールドでの重複チェックができたら便利そうです。

指定したフィールドで重複チェックをするオプション

さて、これをやるにはどのようなオプションをつければいいのでしょうか。マニュアルを見てみます。ありません。 結構調べたけどやっぱりないっぽい。意外。

一応、「(最大で)指定した文字数までで重複チェック」なら -w。でもこれだと一つ目の項目でしかできないし、そもそも文字数にばらつきがあると使えません。

有志によるパッチが作成されているがおそらく本家にマージはされない模様。

http://lists.gnu.org/archive/html/coreutils/2013-02/msg00016.html
http://lists.gnu.org/archive/html/coreutils/2013-02/msg00019.html

sortの-kオプションと同じものを実装したいと2006年に書いてあるがどうなっていることやら…

http://lists.gnu.org/archive/html/bug-coreutils/2006-06/msg00211.html

どうすればいいのか

ワークアラウンドとしては、awk でできます。この場合、重複行のうち残したいものが一番上にくるようにソートしたのちに以下。

awk '!colname[$1]++{print}'

input2.txtの例だとこうなります。

# 名字で重複削除
$ cat input2.txt | awk '!colname[$1]++{print}'
tanaka taro
sato taro

# 下の名前で重複削除
cat input2.txt | awk '!colname[$2]++{print}'
tanaka taro
tanaka ichiro

参考:
awkで重複行を高速削除する。 - 忘れないようにメモっとく
linux - Is there a way to 'uniq' by column? - Stack Overflow

SummerTree
バックエンドえんじにゃー
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした