GNU Parallelを使用してコマンド引数を列値にグループ化できますか?

GNU Parallelを使用してコマンド引数を列値にグループ化できますか?

次のデータを検討してください。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-byParallelがコマンドライン引数の代わりに標準入力を使用するようにすることです。この問題を解決する方法はありません。

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は実際にはできません。

おすすめ記事