쉼표 6개마다 구분 기호 2개를 추가하세요.

쉼표 6개마다 구분 기호 2개를 추가하세요.

나는 노력한다이 질문을 확장하세요하지만 이것을 알아낼 수는 없습니다.

파일이 있다고 가정 해 봅시다 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의 기능은 batchRaku의 호출과 동일합니다 rotor(..., :partial). 마지막에 불완전한 6개 요소 세트를 제거하려면 를 호출하면 됩니다 rotor().

마지막으로, 때로는 splitting이 필요한 답변을 항상 제공하지 못하는 경우도 있습니다. 이 경우 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'

관련 정보