나는 노력한다이 질문을 확장하세요하지만 이것을 알아낼 수는 없습니다.
파일이 있다고 가정 해 봅시다 roll.txt
.
echo "'123456789','987651234','129873645','213456789','987612345','543216789','432156789','876543291','213465789','542637819','123456','23456','22234','3456','7890543','34567891,'2345','567'" >> roll.txt
다음 sed 명령을 사용하면 쉼표 6개마다 줄바꿈 문자를 넣을 수 있습니다.
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'
그러나 쉼표 6개마다 줄 바꿈 두 개를 넣으려고 하면 다음과 같습니다.
sed 's/,/,\n\n/6; P; D' roll.txt
'123456789','987651234','129873645','213456789','987612345','543216789',
'432156789','876543291','213465789','542637819','123456','23456',
'22234','3456','7890543','34567891,'2345','567'
대신 여섯 번째 쉼표 뒤에 두 개의 줄 바꿈이 표시됩니다.4개12번째 쉼표 뒤의 개행 문자입니다. 왜? 쉼표 6개마다 줄 바꿈 두 개를 얻는 방법은 무엇입니까?
답변1
Steeldriver의 의견에 적힌 대로 각 주기마다 두 줄을 추가하지만 한 줄만 인쇄하고 삭제합니다. 긴 시퀀스(3, 7, 15개의 빈 라인 포함)에서는 상황이 더욱 악화됩니다...
따라서 첫 번째 줄이 비어 있으면 교체를 수행하지 마세요.
sed '/^\n/!s/,/,\n\n/6; P; D'
답변2
다중 문자 RS에 GNU awk를 사용하면 각 레코드를 쉼표가 아닌 쉼표 필드 6개로 정의할 수 있습니다.
$ echo "'123456789','987651234','129873645','213456789','987612345','543216789','432156789','876543291','213465789','542637819','123456','23456','22234','3456','7890543','34567891,'2345','567'" |
awk -v RS='([^,]*,){0,6}' 'RT{print RT}'
'123456789','987651234','129873645','213456789','987612345','543216789',
'432156789','876543291','213465789','542637819','123456','23456',
'22234','3456','7890543','34567891,'2345',
각 출력 행에 6개의 필드가 있고 마지막 필드가 비어 있을 때만 종료되어 유효한 CSV인지 확인하려면 ,
다음을 수행할 수 있습니다.
$ echo "'123456789','987651234','129873645','213456789','987612345','543216789','432156789','876543291','213465789','542637819','123456','23456','22234','3456','7890543','34567891,'2345','567'" |
awk -v n=6 'BEGIN{RS="([^,]*,){0,"n"}"; FS=OFS=","} RT{$0=gensub(/,$/,"",1,RT); $n=$n; print}'
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345',
답변3
사용행복하다(이전 Perl_6)
Raku에서 요소를 결합하려면 batch
다음과 같이 결합할 수 있습니다.
~$ raku -ne 'put join "\n", .split(",").batch(6).map: *.join(",");' roll.txt
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'
따라서 각각 사이에 두 개의 개행 문자를 얻으려면 batch
다음을 join
수행하십시오 \n\n
.
~$ raku -ne 'put join "\n\n", .split(",").batch(6).map: *.join(",");' roll.txt
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'
Raku의 기능은 batch
Raku의 호출과 동일합니다 rotor(..., :partial)
. 마지막에 불완전한 6개 요소 세트를 제거하려면 를 호출하면 됩니다 rotor()
.
마지막으로, 때로는 split
ting이 필요한 답변을 항상 제공하지 못하는 경우도 있습니다. 이 경우 comb
데이터를 탐색하여 관심 있는 요소를 추출해 볼 수 있습니다. 아래 코드는 위의 답변과 정확히 동일한 코드를 제공하지만 개념적으로는 더 간단할 수 있습니다. 유일한 어려움은 '
아포스트로피가 한 줄짜리 인용문을 엉망으로 만들 수 있으므로 문자를 유니코드 이름을 사용하여 선언할 수 있다는 것입니다 \c[APOSTROPHE]
.
~$ raku -ne 'put join "\n\n", .comb(/ \c[APOSTROPHE] \d+ \c[APOSTROPHE] /).batch(6).map: *.join(",");' roll.txt
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','2345','567'
https://unix.stackexchange.com/a/611077/227738
https://docs.raku.org/언어/regexes
https://raku.org
답변4
사용 awk
:
$ awk -F, '{for (i=1;i<NF;i++) printf "%s", $i FS ((i%6==0) ? ORS ORS: "") }END{print $NF; print ""}' file
'123456789','987651234','129873645','213456789','987612345','543216789',
'432156789','876543291','213465789','542637819','123456','23456',
'22234','3456','7890543','34567891,'2345','567'