N번째 구분 기호가 나타날 때마다 새 줄을 추가합니다.

N번째 구분 기호가 나타날 때마다 새 줄을 추가합니다.

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,,,,

관련 정보