posix bash, csv 파일을 읽고 특정 열을 무시하는 방법은 무엇입니까?

posix bash, csv 파일을 읽고 특정 열을 무시하는 방법은 무엇입니까?

안에POSIX쉘, 아니파이썬그리고는 아니다(그러니 "실제" 프로그래밍 언어를 사용해야 한다고 굳이 말하지 마세요) 루프를 반복해야 합니다데이터 세트문서.

https://datacadamia.com/lang/bash/read

내 초기 추측은 다음과 같습니다.

while IFS=";" read -r rec_name rec_version rec_license rec_origin rec_modification rec_newlicense
do
    if [ "$name" = "$rec_name" ]; then
        # if [ "$version" = "$rec_version" ]; then
            if [ "$license" = "$rec_license" ]; then
                license="$rec_newlicense"
            fi
        # fi
    fi
done < <(tail -n +2 "${output_file%%.*}.csv")

하지만 마지막 줄은 "POSIX"가 계산서에 맞습니다. 그래서 나는 다음을 시도했습니다.

while IFS=";" read -r rec_name rec_version rec_license rec_origin rec_modification rec_newlicense
do
    if [ "$name" = "$rec_name" ]; then
        # if [ "$version" = "$rec_version" ]; then
            if [ "$license" = "$rec_license" ]; then
                license="$rec_newlicense"
            fi
        # fi
    fi
done < "${output_file%%.*}.csv"

어떻게든 성공하지만 헤더 행도 처리됩니다.

또 다른 문제는 현장'음반 버전','레코드 소스' 그리고'기록 수정'는 인용되지 않았습니다.

어떻게 무시할 수 있나요?

나도 시도했기 때문에:

while IFS=";" read -r -a rec
do
    if [ "$name" = "${rec[0]}" ]; then
        # if [ "$version" = "${rec[1]}" ]; then
            if [ "$license" = "${rec[2]}" ]; then
                license="${rec[5]}"
            fi
        # fi
    fi
done < "${output_file%%.*}.csv"

하지만 나는 다음과 같은 결과를 얻습니다.

read: line 93: illegal option -a

그렇다면 이에 대해 어떻게 생각하시나요?

인사.

답변1

<()첫 번째 시도에서는 POSIX가 아니므로 일반 파이프를 사용하십시오.

tail -n +2 "${output_file%%.*}.csv" | 
  while IFS=";" read -r rec_name rec_version rec_license rec_origin rec_modification rec_newlicense
  do
    if [ "$name" = "$rec_name" ]; then
        if [ "$license" = "$rec_license" ]; then
            license="$rec_newlicense"
        fi
    fi
  done

그런데 이게 좀 복잡한 것 같아요. 구문 분석 중인 데이터를 표시하지 않았기 때문에 확실하지 않지만 다음과 같이 할 수 있을 것으로 생각됩니다.

tail -n +2 "${output_file%%.*}.csv" | 
  while IFS=";" read -r rec_name rec_version rec_license rec_origin rec_modification rec_newlicense
  do
    if [ "$name" = "$rec_name" ] && [ "$license" = "$rec_license" ] 
    then
        license="$rec_newlicense"
    fi
  done

사용하지 않은 용어를 무시하는 경우, 그 사이의 용어에 대해서는 그렇게 할 수 없습니다. 처음 N개 항목을 쉽게 선택하고 나머지는 무시할 수 있습니다.

while read -r var1 var2 rest; do ... done

이것은 처음 2개의 변수를 읽고 나머지 줄을 rest. 또는 셸에 전달하기 전에 제거하세요.

tail -n +2 "${output_file%%.*}.csv" | 
    cut -d';' -f1,3,6 | 
        while IFS=";" read -r rec_name rec_license  rec_newlicense
        do 
          if [ "$name" = "$rec_name" ] && [ "$license" = "$rec_license" ] 
          then
              license="$rec_newlicense"
          fi
        done

관련 정보