Bash 스크립트: csv 파일의 변수 문제

Bash 스크립트: csv 파일의 변수 문제

Linux 컴퓨터의 csv 파일에서 변수를 가져와서 if다음 csv에 넣습니다.

Name;Age
Marc;18
Joseph;10

함수에서 사용하기 위해 csv에서 이 정보를 얻으려고 합니다.

내 배쉬 코드:

#!/bin/ksh

while IFS=";" read -r c_1 c_2 

do
  echo "Name : $c_1"
  echo "Age : $c_2"
   
if [ $c_2 == "18" ]
then
    echo "$c_1 can drive"
fi

done < <(tail -n +2 teste_input.csv)

내 코드를 실행한 후 다음을 얻습니다.

Name : Marc
Age : 18
Name : Joseph
Age : 10

나는 그것을 기대합니다:

Name : Marc
Age : 18
Marc can drive
Name : Joseph
Age : 10

나는 성공하지 못한 채 많은 것을 시도했습니다. 아무 문제 없이 c_1일부 기능에 대한 입력으로 및 를 사용할 수 있습니다. c_2문제는 계산을 하려고 할 때 발생합니다.

만약 내가한다면:

s=$c_2+1
d=$((${c_2}+1))

다음을 반환합니다.

+1
+1")syntax error: invalid arithmetic operator (error token is "

같은 질문을 사용하십시오 d=$(("${c_2}+1")).

작동하게 하려면 무엇을 변경해야 합니까? #!/bin/ksh, #!/bin/sh또는 을 사용하면 #!/bin/bash동일한 결과가 나타납니다.

당신의 도움을 주셔서 감사합니다:)

답변1

첫 번째 문제는 Windows 텍스트 파일을 사용하고 있다는 것입니다. CSV에 Windows 스타일 줄 끝( \r\n)이 있습니다. 다음 방법을 사용하여 문제를 해결할 수 있습니다.

dos2unix teste_input.csv

또는 dos2unix아직 설치하지 않은 경우 다음을 수행하세요.

sed -i 's/\r//g' teste_input.csv

이렇게 하면 코드가 예상한 출력을 생성하게 됩니다. 거의:

$ foo.sh teste_input.fixed.csv 
Name : Marc
Age : 18
$c_1 can drive
Name : Joseph
Age : 10

이는 $c_1다음 줄의 작은따옴표 때문입니다.

echo '$c_1 can drive'

변수는 작은따옴표 내에서 확장되지 않으므로 표시되는 내용 $c_1은 변수 값이 아닙니다. 다음을 수행해야 합니다.

echo "$c_1 can drive"

다음 문제는 ==산술보다는 문자열 비교입니다. 여기서는 작동하지만 숫자 값을 비교하려면 다음이 필요합니다 -eq.

if [ $c_2 -eq "18" ]

그러나 "운전 가능" 출력을 기반으로 변수 값이 같거나 큰지 확인하려는 것으로 의심되므로 18다음을 사용하십시오 -ge.

 if [ $c_2 -ge "18" ]

마지막으로 사용할 쉘을 선택해야 합니다. ksh같지 않음과 bash같지 않음 sh. 구문은 매우 유사하지만 동일하지 않으며 일부 기능은 사용하는 항목에 따라 다르게 작동합니다. 예를 들어 sh지원되지 않습니다 <(command).

당신이 시도하고 있는 산술의 경우 구문이 올바른지 확인하고 "산술 컨텍스트"를 사용해야 합니다. s=$c_2+1간단한 변수 할당을 수행했습니다. 변수의 값을 $s다음 값 으로 설정합니다.$c_2 +1다음에 추가:

$ c_2=10
$ s=$c_2+1
$ echo "$s"
10+1

두 번째 예는 산술 컨텍스트가 설정되어 있기 d=$((${c_2}+1))때문에 작동합니다 .(( ))

$ c_2=10
$ d=$((${c_2}+1))
$ echo "$d"
11

Windows 줄 끝으로 인한 구문 오류:

$ c_2=10$'\r'
$ d=$((${c_2}+1))
+1")syntax error: invalid arithmetic operator (error token is "

따라서 처음에 설명드린 대로 파일을 복구하시면 이런 상황은 사라질 것입니다.

관련 정보