csv의 각 문자열을 여러 줄로 분할하는 방법

csv의 각 문자열을 여러 줄로 분할하는 방법

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=$0awk는 전체 입력 줄의 형식을 다시 지정합니다. 원래 필드 구분 기호( 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"루프 내부로 이동한 것뿐입니다.printffor

귀하의 버전에는 공백이 거의 없으므로 여기에암호화폐 골프논리적 솔루션을 사용하십시오.

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)가 쉼표가 아닌 텍스트와 일치하고 각 항목이 한 줄에 표시됩니다.

관련 정보