datamashを使用して列データ行を行列に変換する

datamashを使用して列データ行を行列に変換する

次のファイルがあります

0   1   1   2.3
0   2   2   3.1
0   3   4   1.3
0   4   5   2.5
0   5   6   7.1
1   1   1   3.3
1   2   2   1.1
1   3   4   2.3
1   4   5   4.5
1   5   6   6.1
2   1   1   2.7
2   2   2   3.5
2   3   4   1.7
2   4   5   2.4
2   5   6   7.5
3   1   1   2.9
3   2   2   3.8
3   3   4   1.9
3   4   5   2.8
3   5   6   7.9

に変換したいです。

#    #    0     1    2    3
1    1   2.3  3.3  2.7  2.9
2    2   3.1  1.1  3.5  3.8
3    4   1.3  2.3  1.7  1.9
4    5   2.5  4.5  2.4  2.8
5    6   7.1  6.1  7.5  7.9

「steeldriver」の意見に基づいてこの投稿、データの3列(3番目の列は除外すると仮定)を行列に変換できました。

 datamash -W crosstab 2,1 unique 3 < file

ただし、2番目の列に基づいてグループ化するために別の列を追加し、「--g 2,3」でスクリプトを変更すると、「datamash:conflicting Operation 'crosstab'」が表示されます。このトラブルシューティングに関する提案はありますか?

答え1

KISSアプローチは、たとえばTABを「実際の」区切り文字として使用して、2番目と3番目の列が単一のフィールドとして処理されるようにデータを前処理することです。

$ awk '{printf "%s\t%s   %s\t%s\n", $1, $2, $3, $4}' file | datamash crosstab 2,1 unique 3
    0   1   2   3
1   1   2.3 3.3 2.7 2.9
2   2   3.1 1.1 3.5 3.8
3   4   1.3 2.3 1.7 1.9
4   5   2.5 4.5 2.4 2.8
5   6   7.1 6.1 7.5 7.9

関連情報