이런 파일이 있어요
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