Bash에서 CSV 파일 작업

Bash에서 CSV 파일 작업

헤더를 각 행을 변경하는 변수로 사용하는 CSV 파일을 갖고 싶지만 while read -r각 행에서 For 루프를 실행하는 것과 같은 간단한 작업을 수행하고 싶습니다. 루프 동안 나는 각 항목이 특정 변수가 되기를 원합니다. 예를 들어 csr 파일을 생성합니다.

CSV는 다음과 같습니다.

server alias cn san environment
server1,srv1,srv1.domain.com,"dns:srv1.coolstuff.org,dns:srv1.morecoolstuff.org:,production
server2,srv2,srv2.domain.com,"dns:srv2.dev.coolstuff.org,dns:srv2.dev.morecoolstuff.org",development

잠깐만요... 다 지나갈 거예요

keytool -gen 어쩌구 저쩌구 항목의 각 줄을 사용합니다.

누구든지 아이디어가 있나요? 나는 고양이 가죽을 벗기는 방법이 8,000가지가 있다는 것을 알고 있습니다.

답변1

저는 보통 csvtoolbash 스크립트를 사용하여 CSV 파일을 처리합니다.

다음과 같이 해야 합니다.

csvtool namedcol server,alias,cn,san,environment input.csv \
| csvtool -u TAB drop 1 - \
| while IFS=$'\t' read -r server alias cn san environment; do
   echo "server: ${server}"
   echo "alias: ${alias}"
   echo "cn: ${cn}"
   echo "san: ${san}"
   echo "environment: ${environment}"
   # do something with it...
   keytool -genkey -alias "${alias}" -keyalg RSA -keysize 2048
done

첫 번째 호출에서는 csvtool열 순서가 고정되지 않은 경우 CSV 파일의 열을 이름별로 출력합니다.

두 번째 호출은 CSV 헤더를 제거하고 ,입력 데이터에 탭이 아닌 쉼표가 포함될 수 있는 경우를 대비하여 일부 구분 기호를 수정합니다(대신 "\t" 사용).

그런 다음 envvar를 read사용하여 IFS호출 하고 read변수 이름에 값을 할당하는 데 동일한 구분 기호를 사용합니다.

관련 정보