次のデータを検討してください。GNUパラレルマニュアル例--group-by
:
cat > table.csv <<"EOF"
UserID, Consumption
123, 1
123, 2
12-3, 1
221, 3
221, 1
2/21, 5
EOF
レコードを1つの列にグループ化し、グループ内の他の列のすべての値をコマンドライン引数として書き込む方法はありますか?
このコマンドはグループ化されていませんが、私が望む出力構造を提供します。
cat table.csv | parallel --colsep , --header : -kN1 echo UserID {1} Consumption {2}
UserID 123 Consumption 1
UserID 123 Consumption 2
UserID 12-3 Consumption 1
UserID 221 Consumption 3
UserID 221 Consumption 1
UserID 2/21 Consumption 5
どのコマンドがそのような出力を提供しますか?
UserID 123 Consumption 1 2
UserID 12-3 Consumption 1
UserID 221 Consumption 3 1
UserID 2/21 Consumption 5
また、「消費される」値の数を制限したいと思います。
1つのグループに4人以上がいるとしましょう。
cat > table.csv <<"EOF"
UserID, Consumption
123, 1
123, 2
123, 3
123, 4
123, 5
123, 6
123, 7
12-3, 1
221, 3
221, 1
2/21, 5
EOF
コマンドラインに「消費」値が4つ以下であることを望みます。
UserID 123 Consumption 1 2 3 4
UserID 123 Consumption 5 6 7
UserID 12-3 Consumption 1
UserID 221 Consumption 3 1
UserID 2/21 Consumption 5
--group-by
マニュアルには正しいグループを選択する方法が記載されています。
cat table.csv | \
parallel --pipe --colsep , --header : --group-by UserID -kN1 wc
4行の出力wc
は4グループで動作するという意味です。たとえば、最初のグループには3行、6単語、40文字があります。
3 6 40
2 4 30
3 6 40
2 4 30
グループ入力をより明確にするwc
ためにcat
。
cat table.csv | \
parallel --pipe --colsep , --header : --group-by UserID -kN1 cat
cat 出力は、元の入力行をジョブに並列に渡し、ヘッダー行を各グループの最初の行にコピーすることを示します。
UserID, Consumption
123, 1
123, 2
UserID, Consumption
12-3, 1
UserID, Consumption
221, 3
221, 1
UserID, Consumption
2/21, 5
問題は、--group-by
Parallelがコマンドライン引数の代わりに標準入力を使用するようにすることです。この問題を解決する方法はありません。
GNU Parallelにパラメータを渡す方法を変更する必要がありますか? GNUパラレル実行を使用する前に正しい形式を生成するには、他のツールを使用する必要がありますか?
私はGNUパラレルバージョン20231122を使用しています。
答え1
Bashでは、次のことができます。
doit() { parallel --header : --colsep , -n4 echo UserID {1} Consumption {2} {4} {6} {8}; }
export -f doit
cat table.csv | parallel --pipe --colsep , --header : --group-by UserID -kN1 doit
parallel
私はあなたが一度にこれを行うことができるとは思わない。あなたが望むのはミックスモード--pipe
とノーマルモードですが、GNU Parallelは実際にはできません。