考虑来自的数据GNU 并行手册的示例--group-by
:
cat > table.csv <<"EOF"
UserID, Consumption
123, 1
123, 2
12-3, 1
221, 3
221, 1
2/21, 5
EOF
有没有一种方法可以按一列对记录进行分组,并将组中另一列的所有值作为命令行参数写入?
该命令不会分组,但会提供我想要的输出结构。
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
我还想限制“消耗”值的数量。
假设其中一组有超过 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 确实不能做到这一点。