다음과 같은 입력이 주어졌습니다.
field1,field2,field3,field4
나는 이런 출력을 얻고 싶다
field1
field2
field3
field4
awk를 사용하여 이 작업을 어떻게 수행할 수 있나요?
답변1
Awk의 관용적 방법은 다음과 같습니다.
awk 'BEGIN{FS=","; OFS="\n"} {$1=$1} 1'
또는 동등하게
awk '{$1=$1} 1' FS=, OFS='\n'
새로운 구분 기호를 사용하여 레코드를 강제 {$1=$1}
로 재평가 OFS
하고 1
기본 print
작업을 트리거합니다. 원하는 경우 다른 표현(예: NF += 0
)을 사용하여 재평가를 강제할 수 있습니다. 이는 선호 사항의 문제입니다.
빠르고 더러운 방법은
awk -vRS=, 1
(또는 awk 1 RS=,
) 쉼표로 구분된 각 단어를 완전한 레코드로 처리하고 기본 개행 레코드 구분 기호를 사용하여 출력합니다.
답변2
사용티쉼표를 개행 문자로 변환합니다.
echo "field1,field2,field3,field4" | tr "," "\n"
이것은 아마도 를 사용하는 것보다 빠르지만 awk
, 원한다면 다음과 같이 할 수 있습니다:
echo "field1,field2,field3,field4" | awk '{gsub(",","\n");print}'
~에서GNU awk 문서:
gsub(정규식, 바꾸기[, 대상])
찾을 수 있는 가장 길고, 가장 왼쪽에 있으며, 겹치지 않는 일치하는 모든 하위 문자열을 대상에서 검색하고 이를 대체 문자열로 바꿉니다. gsub()의 "g"는 "global"을 의미하며 모든 곳에서 대체를 의미합니다.
답변3
사용 bash
및 csvformat
에서csvkit
필드 구분 기호를 쉼표에서 줄 바꿈 세트로 변경합니다.
$ csvformat -D $'\n' file
field1
field2
field3
field4
이는 입력 file
CSV가 올바른 형식이라고 가정합니다. 또한 포함된 쉼표를 올바르게 처리합니다.
$ cat file
"field,1",field2,field3,field4
$ csvformat -D $'\n' file
field,1
field2
field3
field4