次のファイルがあります
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