roll.txt
줄 바꿈 없이 쉼표로 구분된 형식으로 다음 데이터를 포함하는 파일이 있습니다 .
'123456789','987651234','129873645','213456789','987612345','543216789','432156789','876543291','213465789','542637819','123456','23456','22234','3456','7890543','34567891,'2345','567'
각 줄 끝에 쉼표 없이 쉼표 구분 기호가 6번 나타날 때 마다 새 줄을 삽입해야 합니다 .
예상되는 출력은 다음과 같습니다.
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'
다음 명령을 사용하고 있지만 sed
작동하지 않습니다.
sed 's/[^,]//g'
답변1
그리고 tr
& paste
:
tr ',' '\n' <infile |paste -sd',,,,,\n'
더 많은 가독성과 이해를 위해:
tr ',' '\n' <infile |paste --serial --delimiters=',,,,,\n'
이 경우 말할 때마다 개행을 추가하고 싶을 때,N=100위치에 있는 경우 쉼표 99개를 입력하는 것을 좋아하지 않을 것입니다 ',,,,,,,,,, ... ,\n'
. 대신 printf
중괄호 확장을 통해 생성해 보겠습니다.
tr ',' '\n' <infile |paste -sd $(printf '%.1s' ,{1..99})'\n'
~에서man paste
:
-d, --delimiters=목록 TAB 대신 LIST의 문자 재사용 -s, --serial 파일을 병렬로 붙여넣는 대신 한 번에 하나씩 붙여넣기
답변2
적어도 GNU sed
와필드에 쉼표 구분 기호가 포함될 수 없다고 가정,넌 할 수있어
sed 's/,/\n/6; P; D' roll.txt
6번째 쉼표를 줄바꿈으로 바꾸는 것을 반복적으로 시도하고 인쇄한 다음 줄바꿈까지 패턴 공간의 일부를 제거합니다.
D
참고: 명령이 나머지 줄에서 암시적으로 "루프를 다시 시작" 하므로 명시적으로 표시된 테스트/분기를 구현할 필요가 없습니다 .
D
패턴 공간에 개행 문자가 포함되어 있지 않으면 d 명령이 실행된 것처럼 일반적인 새 루프가 시작됩니다. 그렇지 않으면 패턴 공간에서 첫 번째 개행 문자까지 텍스트를 삭제하고,새 입력 라인을 읽지 않고 생성된 패턴 공간을 사용하여 루프를 다시 시작합니다..
(이를 명확히 해준 @RakeshSharma에게 감사드립니다).
전임자.
sed 's/,/\n/6; P; D' roll.txt
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'
또는 Perl의 Text::CSV
모듈을 사용하십시오.
perl -MText::CSV -ne '
BEGIN{$p = Text::CSV->new()}
@fields = $p->fields() if $p->parse($_);
do {
print join ",", splice @fields, 0, 6; print "\n";
} while @fields
' roll.txt
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'
답변3
변종αГsнιn의 답변:
$ tr ',' '\n' <file | paste -d, - - - - - -
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'
이는 모든 필드에 쉼표가 포함되어 있지 않다고 가정합니다.
입력에 6개 필드의 배수가 없으면 다음과 같은 출력이 나올 수 있습니다.
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'
hello,world,,,,