쉼표로 구분된 CSV가 있는데 줄 바꿈으로 구분하고 싶습니다.
입력하다:
a, b, c
산출:
a
b
c
vim
이 작업을 수행하는 Java 파서를 작성했지만 이를 수행하기 위해 다른 도구를 사용할 수 없습니까 ?
sed
나에게 적합하지 않음:
#!/bin/sh
# Start
cat > infile.csv << __EOF__
a, b, c
__EOF__
cat infile.csv
sed 's/, /\n/g' infile.csv > outfile.csv
cat outfile.csv
답변1
다른 답변이 원하는 것을 달성하는 것처럼 보이며 스크립트 가능한 도구가 가장 적합한 옵션인 것 같습니다.
하지만 vim에 대해 묻는 것이므로 다음과 같이 할 수 있습니다.
%s/, /\r/g
즉, 모든 쉼표 + 공백을 캐리지 리턴으로 바꾸십시오. 그러면 이는 파일에 대한 적절한 줄 끝 문자로 해석됩니다. (검색을 통해 확인하실 수 있습니다 \r
. 검색되지 않습니다.)
답변2
~처럼이안의 대답, 다음을 사용할 수도 있습니다 tr
.
$ echo a,b,c | tr ',' '\n'
a
b
c
두 답변 모두 CSV가 단순하다고 가정합니다(즉, 모든 쉼표는 필드 구분 기호입니다). a,"b,c",d
"단일 필드가 어디에 있습니까?"와 같은 질문이 있으면 b,c
상황이 더 어려워집니다.
답변3
\n
POSIX는 sed의 대체 텍스트에 사용을 허용하지만 강제하지는 않습니다 . GNU sed가 이를 수행할 수 있지만 문자 그대로 출력하는 s
구현도 있습니다 .\n
POSIX 호환 awk를 사용할 수 있습니다. 입력 필드 구분 기호를 FS
정규식으로 설정하고 출력 필드 구분 기호를 ORS
문자열(일반적인 백슬래시 이스케이프 사용)로 설정합니다. $1=$
다른 필드 구분 기호를 사용하도록 행을 다시 작성하려면 할당이 필요합니다 .
awk -vFS=', *' -vOFS='\n' '{$1=$1; print}'
(입력 내용에 따옴표 없이 일반 쉼표와 공백으로 구분된 값이 포함되어 있다고 가정합니다. 따옴표가 있는 경우 Perl 또는 Python과 같은 언어로 실제 CSV 파서를 사용해야 합니다.)
답변4
사용행복하다(이전 Perl_6)
perl6 -pe 's:g/ "," \s /\n/;'
#OR
perl6 -ne '.split(", ").join("\n").put;'
또한 삽입된 개행 문자, 따옴표 안의 쉼표 등이 걱정된다면 Raku Text::CSV
모듈을 사용하세요.
raku -MText::CSV -e '.join("\n").put for csv(in => lines, sep => ", ");'
입력 예:
a, b, c
출력 예(위의 모든 코드):
a
b
c
https://unix.stackexchange.com/a/701805/227738
https://raku.org