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

레코드를 하나의 열로 그룹화하고 그룹에 있는 다른 열의 모든 값을 명령줄 인수로 쓰는 방법이 있습니까?

이 명령은 그룹화되지 않지만 내가 원하는 출력 구조를 제공합니다.

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-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은 실제로 그렇게 할 수 없습니다.

관련 정보