次の 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
s
てg
グループ化し、最初の列の固有値に対応するnd列の値をカンマ区切りリストに配置します。その後、すべてのコンマはabsに変換され、2番目は行/列を置き換えて、フィールド数が異なる行を通過させ、欠落値を(空のフィールド)で埋めます。,
1
collaps
2
tr
\\t
datamash
--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