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 "

따라서 처음에 설명한 대로 파일을 수정하면 문제가 해결됩니다.

관련 정보