重複したフィールドを持つ行のラベルのマージ

重複したフィールドを持つ行のラベルのマージ

次の形式のかなり大きなテキストファイル(数千行)があります。

123.123 5  
123.123 91  
156.456 45  
233.185 85  
233.185 4  
257.448 1  
455.456 60  
455.456 2

最初の列はソート座標(xy)、2番目の列はラベル(0〜1000)です。座標123.123にはラベル5とラベル91があり、座標156.456にはラベル45のみがあることがわかります。

すべての座標(繰り返しなし)と異なるラベル(このラベルは複数回表示)を含む出力として異なるファイルが必要です。この例の出力は次のようになります。

123.123  5   91  
156.456  45   
233.185  85  4  
257.448  1  
455.456  60  2   

私の考えは、重複した文字列(座標、最初の列のみ)を削除し、ラベルをそのままにしてから行などを再編成することですが、どのコマンドを使用するかをやめます。
別のオプションはデータベースを使用することです。

答え1

awkのための仕事だと思います。

 awk '{ c[$1]=c[$1] "\t" $2 ; } END { for ( c2 in c ) printf c2 c[c2] "\n" ; } '

どこ

  • c[$1]=c[$1] "\t" $2はラベルを保存し、
  • END句はファイルの末尾で実行されます。
  • for ( c2 in c ) printf c2 c[c2] "\n" ;座標を繰り返してラベルを印刷します。

答え2

perl -p0e 'while(s/^(\S+)( .*)(\n\1)/\1\2/m){}'

基本的なアイデアは次のとおりです。

  • -p0ファイルをメモリにロードし、最後に印刷します。
  • -eロードされたファイルで次の引数を実行する
  • 可能であれば、次のもの<word> <line>\n<word>と交換してください。<word> <line>

関連情報