안에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