列に基づいてファイルパーティションを分割する

列に基づいてファイルパーティションを分割する

次のデータセットがあります。

M1  1   1233
M2  1   3212
M3  1   55323
M4  1   4444233
M5  1   23444
M6  1   555333
M7  1   55567
M8  2   22224
M9  2   55566
M10 2   4567
M11 3   44242
M12 3   234234
M13 4   2233
M14 4   2442
M15 4   322352
M16 4   235242
M17 4   2324524
M18 5   232342
M19 6   2322523
M20 6   2332523

2番目の列の値に基づいて配列を作成したいと思います。12番目の列のすべての行に異なるコマンドを適用し、2番目の列の行に別のコマンドを適用し2、別のファイルに保存したいのですが、どうすればいいのかわかりません。whileコマンドを試しましたが、すべての試みが失敗しました。

このコードの出力は、配列の各インデックスにある元のファイルのサブセットでなければなりません。たとえば、次のようになります。

インデックス1

M1  1   1233
M2  1   3212
M3  1   55323
M4  1   4444233
M5  1   23444
M6  1   555333
M7  1   55567

indexi2

M8  2   22224
M9  2   55566
M10 2   4567

など

インデックスi6

M19 6   2322523
M20 6   2332523

このインデックスに別のコマンドを適用したいと思います。

シェルスクリプトおよび/またはawkでこれをどのように実行しますか?

ベストアンサー1

awkで最高の結果を得ることができます。

awk '{ print > "index i"$2 }' < input

シェルでのみこれを実行できます。

while read a b c
do
        printf '%s\n' "$a $b $c" >> "index i$b"
done < input

awkソリューションには次の利点があります。

  • 既存のファイルが上書きされます。シェルスクリプトは既存のファイルに追加されます。 (これはあなたが望むものかもしれないと思います。その場合は、awkスクリプトの代わりにそれを>>使用して実行できます。)>
  • awk スクリプトは入力ファイル間隔を維持します。シェルスクリプトは、複数のスペースを単一のスペースに減らします。
  • 大容量データファイルの場合、awkスクリプトは少し速くなる可能性があります。

おすすめ記事