이 사용법을 고려하십시오칼럼(1):
column -s, -t <<CSV
a,b,c
,ee,ff
CSV
위의 코드 조각은 다음을 내보냅니다.
a b c
ee ff
그러나 나는 다음과 같은 것을 볼 것으로 기대합니다.
a b c
ee ff
column
두 번째 행에서 선행 공백 "셀"이 제거되는 것 같지만 나는 그것을 기대하고 유지하고 싶습니다.
열에서 공백 제거 동작을 비활성화하는 방법이 있습니까? 표준/권장 해결 방법 제안이 있습니까?
나는 사용하려고RS(1), 하지만 이 명령에 대해 다른 질문이 있습니다.rs(1)은 모든 출력을 한 줄에 인쇄합니다. 입력 배열 모양을 복사하는 방법은 무엇입니까?
답변1
사용행복하다(이전 Perl_6)
Raku의 모듈을 사용할 수 있습니다 Text::CSV
. 이 모듈은 RFC-4180(및 RFC-4180/RFC-7111)을 준수하는 파일을 출력합니다. 말할 필요도 없이, 빈 선행 셀은 보존됩니다. 아래에서는 다양한 열 구분 기호(탭)를 사용한 출력 데모를 보여줍니다.
~$ raku -MText::CSV -e 'my @a = csv(in => $*IN); csv(in => @a, out => $*OUT, sep => "\t");' file
입력 예:
a,b,c
,ee,ff
출력 예(탭으로 구분):
a b c
ee ff
파일이 크거나 CSV 파일을 한 줄씩 읽으려면 아래 링크를 참조하세요.
https://unix.stackexchange.com/a/722776/227738
https://github.com/Tux/CSV/blob/master/doc/Text-CSV.pdf
https://raku.org
답변2
이 column
유틸리티는 각 행의 시작과 끝에서 빈 열을 제거합니다. 이로 인해 관찰되는 열이 잘못 정렬됩니다. 유틸리티에는 이 동작을 비활성화하는 옵션이 없습니다.
일반 CSV 문서를 다른 형식(예: TSV)으로 변환하려는 경우 Miller와 같은 CSV 인식 도구를 사용하는 것이 더 안전한 방법입니다.
$ mlr --icsv --otsv cat <<END_DATA
a,b,c,"d,e"
,ee,ff,"ok ""hello"""
END_DATA
a b c d,e
ee ff "ok ""hello"""
$ mlr --icsv --opprint cat <<END_DATA
a,b,c,"d,e"
,ee,ff,"ok ""hello"""
END_DATA
a b c d,e
- ee ff ok "hello"
$ mlr --icsv --opprint --barred cat <<END_DATA
a,b,c,"d,e"
,ee,ff,"ok ""hello"""
END_DATA
+---+----+----+------------+
| a | b | c | d,e |
+---+----+----+------------+
| - | ee | ff | ok "hello" |
+---+----+----+------------+
답변3
"비표준" 도구가 괜찮다면,XSV 툴킷다소 임의적으로 구분된 텍스트 데이터의 형식을 적절하게 지정할 수 있습니다.
xsv table <<CSV
a,b,c
,ee,ff
CSV
a b c
ee ff
답변4
데이터가 따옴표나 줄 바꿈이 없는 "간단한 CSV"이므로 쉼표는 구분된 필드에만 나타날 수 있으며, 이를 사용하여 awk
원하는 효과를 얻을 수 있습니다.
awk -F, 'BEGIN {OFS="\t"} {$1=$1; print}' <<CSV
a,b,c
,ee,ff
CSV
산출
a b c
ee ff