列でデータを並べ替える

列でデータを並べ替える

次の big data.txt ファイルがあります。

6712,04444
6712,02344
6712,02220
6712,02233
5322,00040
5322,02230
5322,42002
4444,03342
4444,03323
11,42023
11,00000
11,23443
11,23232

次に、rawデータから次のようなdata.txtを作成したいと思います。

col6712  col5322  col4444   col11
04444     00040    03342    42023
02344     02230    03323    00000
02220     42002             23443 
02233                       23232

実際には、元のファイルの最初の列が列番号になりたいのですが、元のファイルの各行の内部部分は関連する列の下になければなりません。私の目標を達成するためのLinuxコマンドはありますか?

答え1

そしてgnu datamash:

datamash -t, -s -g 1 collapse 2 <data.txt | tr , \\t | datamash --no-strict --filler '' transpose

datamash入力をソートする必要があるため、出力は次のようになります。

11      4444    5322    6712
42023   03342   00040   04444
00000   03323   02230   02344
23443           42002   02220
23232                   02233

仕組み:
最初は、stフィールドで区切られた入力をソートしdatamash sgグループ化し、最初の列の固有値に対応するnd列の値をカンマ区切りリストに配置します。その後、すべてのコンマはabsに変換され、2番目は行/列を置き換えて、フィールド数が異なる行を通過させ、欠落値を(空のフィールド)で埋めます。,1collaps2tr\\tdatamash--no-strict''


参考までに、入力例の行は最初のフィールドでグループ化され、逆の順序でソートされているため、実際に同じ順序を取得するには、2番目のフィールドにリンクする前に並べ替えることができますdatamash

datamash -t, -s -g 1 collapse 2 <data.txt | tr , \\t | \
sort -k1nr | datamash --no-strict --filler '' transpose

希望の出力を生成します。

6712    5322    4444    11
04444   00040   03342   42023
02344   02230   03323   00000
02220   42002           23443
02233                   23232

関連情報