列でリストを並べ替える

列でリストを並べ替える

次のようなリストがあります。

192.168.2.1    sometext.com
192.168.2.1
192.168.2.3
192.156.1.6
192.156.1.6    moretext.com
192.123.1.1
192.564.7.3
192.564.7.3    hello.com

必要な出力は次のとおりです。

192.168.2.1    sometext.com
192.168.2.3
192.156.1.6    moretext.com
192.123.1.1
192.564.7.3    hello.com

ホスト名のないIPを削除したいです。〜しない限りホスト名を含む行が既に存在します。

上記の例をご覧ください。

大丈夫ですか?

答え1

awk解決策は次のとおりです(出力順序は重要ではないと仮定します)。

awk '!seen[$1]{ seen[$1]=$0; next } $2!=""{ seen[$1]=$0 } 
    END{ for (x in seen) print seen[x] }' infile

seenここでは、キーインデックスと呼ばれる連想配列を定義します$1。したがって、配列にないIPである最初の列のキーを確認し、そのキー値に行!seen[$1]全体を追加して読み取ります。そうでない場合(IPは以前に解決され、配列に存在します)、次の行に同じIPがあり、ホスト名がある場合は、そのキーの値を現在の行の値に更新します。$0next

最後に、x配列インデックスで処理される変数を使用して配列を繰り返し、そのキーの値を印刷します。

関連情報