쉼표로 구분된 필드의 한 줄을 각각 특정 수의 필드를 포함하는 여러 줄로 분할하는 방법은 무엇입니까?

쉼표로 구분된 필드의 한 줄을 각각 특정 수의 필드를 포함하는 여러 줄로 분할하는 방법은 무엇입니까?

이런 파일이 있어요

Hello,Hi,Hullo,Hammers,Based,Random

의 경우 n=2출력은 다음과 같아야 합니다.

Hello,Hi
Hullo,Hammers
Based,Random

의 경우 n=3출력은 다음과 같아야 합니다.

Hello,Hi,Hullo
Hammers,Based,Random

이를 수행하기 위해 awk/sed를 어떻게 사용할 수 있습니까?

편집: n필드 수는 요소입니다.

답변1

$ awk -v n=2 -F',' '{for (i=1;i<=NF;i++) printf "%s%s", $i, (i%n ? FS : ORS)}' file
Hello,Hi
Hullo,Hammers
Based,Random

$ awk -v n=3 -F',' '{for (i=1;i<=NF;i++) printf "%s%s", $i, (i%n ? FS : ORS)}' file
Hello,Hi,Hullo
Hammers,Based,Random

귀하의 질문에서는 필드 수가 나눌 수 없는 경우를 처리하는 방법을 다루지 않았 n으므로 여기서도 다루지 않았습니다.

답변2

sum을 사용하는 또 다른 tr방법 paste:

n=2인 경우,

$ <input tr ',' '\n' | paste  -d ',' - -
Hello,Hi
Hullo,Hammers
Based,Random

n=3인 경우,

$ <input tr ',' '\n' | paste  -d ',' - - -
Hello,Hi,Hullo
Hammers,Based,Random

답변3

펄 사용:

$ echo 'Hello,Hi,Hullo,Hammers,Based,Random' | 
    perl -F, -le '
      BEGIN { $n = shift };
      for ($i=0; $i < @F; $i += $n) {
         print join(",", @F[$i .. ($i + $n - 1)]);
      }' 2
Hello,Hi
Hullo,Hammers
Based,Random

이는 첫 번째 인수를 출력 행당 인쇄할 항목 수로 사용합니다(변수 사용 $n). STDIN 및 모든 파일 이름 매개변수가 입력으로 사용됩니다.

-F,해당 옵션(암시적으로 활성화 -a및 옵션) 으로 인해 -n자동으로 각 입력 줄을 읽고 쉼표로 구분하여 배열로 만든 다음 @F배열의 인덱스를 한 번에 하나씩 반복합니다. 요소는 각 출력 라인에 인쇄됩니다.$n$n

참고: 사용텍스트::CSV단순한 쉼표로 구분된 입력이 아닌 따옴표로 묶인 필드와 따옴표에 포함된 쉼표를 사용하여 실제 CSV를 구문 분석해야 하는 경우 모듈을 사용하세요.

3대신 출력 매개변수는 다음과 같습니다 2.

$ echo 'Hello,Hi,Hullo,Hammers,Based,Random' | perl -F, -le 'BEGIN{$n = shift};for($i=0;$i<@F;$i+=$n){print join(",",@F[$i..($i+$n-1)])}' 3
Hello,Hi,Hullo
Hammers,Based,Random

다시 4:

$ echo 'Hello,Hi,Hullo,Hammers,Based,Random' | perl -F, -le 'BEGIN{$n = shift};for($i=0;$i<@F;$i+=$n){print join(",",@F[$i..($i+$n-1)])}' 4
Hello,Hi,Hullo,Hammers
Based,Random,,

답변4

awk다시 및 newlines로
구분된 값 세트를 입력하고 고정 너비 csv를 출력합니다.,

awk '{printf((FNR>1?(FNR-1)%n?",":ORS:"")$0)}END{print ""}' RS='[,\n]' n=4 <<END
Hello
Hi,Hullo,Hammers,Based
Random
END

Hello,Hi,Hullo,Hammers
Based,Random

관련 정보