2017-02-10 6 views
0

私はRでこれを行う方法を知っていますが、残念ながら私のデータセットが大きすぎますので、長いフォーマットから広いフォーマットにデータセットを変換するシェルを使用しようとしています。unix長いと広いに変換する

現在のフォーマットは次のようなものです:私は2番目の列が新しい列になり、3列目はカウントになるように、幅広いフォーマットに変換したい

Name1 A 3 
Name2 A 6 
Name3 A 10 
Name3 B 2 
Name4 A 4 
Name5 B 1 

。何の谷が存在しない場合、私はこのようにその場所に0を挿入する:Linuxの私の限られた知識と私のオンライン検索から

Name A B 
Name1 3 0 
Name2 6 0 
Name3 10 2 
Name4 4 0 
Name5 0 1 

私は本当にこれをアプローチする方法がわかりません。

私がこの問題を回避しようとしたことの1つは、grepを使用してファイルを2つの別々のファイルにサブセット化し、次に長い結合を試みることです。この

grep A file | sort -k 1 > file_A 
grep B file | sort -k 1 > file_B 
join -o '0,1.2,1.3,2.2,2.3' -e "0" -a1 -a2 <(sort -k 1 file_A) <(sort -k 1 file_B) > output 

は、私はちょうどjoinコマンドを実行すると動作するように表示されます。しかし、私は、ファイルへの出力を指示しようとすると、私は次のようなエラーメッセージが表示されます:

私はオンラインで読むファイルが正しくソートされていないときにこのエラーが表示されることを示しているが、私は実際に考えている
join: /dev/fd/63:63: is not sorted: Name4 A 83 
join: /dev/fd/62:15: is not sorted: Name5 B 3 

すべて私は列1でそれらを2回並べ替えます。

広い形式から長い形式に移行するための最良の方法や、サマリーテーブルを作成しようとする試みのトラブルシューティング方法については、大変感謝しています。ありがとうございました。

答えて

2

これはのツールのほうがjoinです。情報を保持するための2次元データ構造が必要です。私はソート順に配列キーを反復処理するためにGNU awkを使用しています。

gawk ' 
    {val[$1][$2] = $3} 
    END { 
     PROCINFO["sorted_in"] = "@ind_str_asc" 
     print "NAME A B" 
     for (name in val) 
      print name, 0+val[name]["A"], 0+val[name]["B"] 
    } 
' file 

解除アレイ要素は数ゼロの代わりに空の文字列のように扱われるように、Iはゼロに値を追加しています。

+0

ありがとうございました!私は前にgawkを使用したことはありませんが、このスクリプトは完全に機能します!ジョインを使用することは、わたしが心地よく感じたコマンドを使って創造的に考えることを試みる偶然の試みでしたが、このgawkの解決策ははるかに優れています! – user4670961

関連する問題