csv 행의 각 문자열을 분리하고 싶습니다.
라인 예시(다른 라인, 동일한 개념일 수 있음)
machine23,machine094,machine73,machine83
그럼 이것을 시도해 봅시다
echo machine23,machine094,machine73,machine83 |awk -F"," '{for(i=1;i<=NF;i++){printf "%-20s", $i};printf "\n"}'
하지만 우리는 얻습니다
machine23 machine094 machine7 machine83
대신 다음과 같은 예상 결과를 얻습니다.
machine23
machine094
machine7
machine83
어떤 제안이 있으십니까?
답변1
$ echo machine23,machine094,machine73,machine83 | tr ',' '\n'
machine23
machine094
machine73
machine83
또는 정말로 이 작업을 awk에서 수행하려는 경우(아마도 awk에서 추가 처리를 원하기 때문일 수 있음):
$ echo machine23,machine094,machine73,machine83 | \
awk -F',' -v OFS='\n' '{$1=$1;$0=$0;print}'
machine23
machine094
machine73
machine83
이는 깔끔한 awk 트릭을 사용합니다. 필드를 변경한 후( 에서와 같이 필드가 자체와 동일하게 설정된 경우에도 $1=$
) set 하면 $0=$0
awk는 전체 입력 줄의 형식을 다시 지정합니다. 원래 필드 구분 기호( FS
이 경우 쉼표)를 다음으로 대체합니다. 출력 필드 구분 기호( OFS
이 경우 개행 문자)입니다.
답변2
첫째, 교육의 정신으로 다음은 자신만의 논리를 미리 준비된 버전으로 정리한 것입니다(가독성을 위해 포장하고 간격을 두었습니다).
$ echo machine23,machine094,machine73,machine83 \
|awk -F"," '{ for (i = 1; i <= NF; i++) { printf "%-20s\n", $i } }'
machine23
machine094
machine73
machine83
사용한 이후로 후행 공백이 추가되지만 %-20s
(위의 출력을 선택하여 확인) 제가 한 일은 printf "\n"
루프 내부로 이동한 것뿐입니다.printf
for
귀하의 버전에는 공백이 거의 없으므로 여기에암호화폐 골프논리적 솔루션을 사용하십시오.
echo machine23,machine094,machine73,machine83|awk -F, '{while(i<NF)print$++i}'
다음은 루프 없이 전역 대체를 사용하는 필드 독립적 awk 솔루션입니다.
$ echo machine23,machine094,machine73,machine83 |awk '{ gsub(/,/,"\n"); print }'
machine23
machine094
machine73
machine83
이는 다음 sed 솔루션을 모방합니다.
$ echo machine23,machine094,machine73,machine83 |sed 's/,/\n/g'
machine23
machine094
machine73
machine83
위의 두 가지 모두 쉼표를 줄 바꿈으로 바꿉니다.CAS의 tr 솔루션.
grep 솔루션은 다음과 같습니다.
$ echo machine23,machine094,machine73,machine83 |grep -o '[^,]*'
machine23
machine094
machine73
machine83
이렇게 하면 grep show only( -o
)가 쉼표가 아닌 텍스트와 일치하고 각 항목이 한 줄에 표시됩니다.