csv 파일 값과 비교

csv 파일 값과 비교

csv 파일이 있는데 두 번째 행의 네 번째 열에 있는 값을 문자열과 비교해야 합니다.

샘플 csv 파일:

Col1,Col2,Col3,Col4
Val1,Val2,Val3,ValNeeded

이 작업을 수행하기 위해 아래 코드를 사용하고 있습니다.

varcsv=`sed '2q;d' file.csv | cut -d',' -f4 | tr -d ' '`

myvar=ValNeeded

if [ "$varcsv" = "$myvar" ]; then
    echo "true"
else
    echo "false"
fi

이 코드의 출력은 false이고 길이는 varcsv입니다 10(길이가 올바르지 않더라도).

어디에서 변경이 필요한지 알려주세요.

답변1

내 답변을 댓글로 게시하고 댓글이 삭제되었지만 다시 한 번 시도해 보겠습니다.

접근 방식은 괜찮지만 너무 많은 외부 바이너리에 대한 종속성이 필요하지 않도록 개선할 수 있습니다. 예를 들어, 문제를 해결하려면 awk다음과 같이 사용할 수 있습니다 .

awk -F, -vmyvar="ValNeeded" 'NR==2 { if ($4 == myvar) print "match"; else print "No match"}'  file.csv

코드를 유지하고 싶지만 약간만 다시 작성하면 다음과 같습니다.

#!/bin/bash

varcsv=$(awk -F, 'NR==2 { print $NF }' file.csv)
myvar=ValNeeded
if [[ $varcsv == "$myvar" ]]; then
    echo "true"
else
    echo "false"
fi

거기 $NF에서 레코드의 마지막 필드를 가져옵니다.

Philippos가 이미 언급했듯이 파일에는 CR/LF라고도 불리는 MSDOS 줄 끝이 포함되어 있습니다. cat, sed, 및 기타 여러 도구를 사용하여 다양한 방법으로 이를 확인할 수 있지만 od간단하게 유지하고 사용하겠습니다. 이 경우에는 다음과 cat같습니다 .sed

cat -vEt file.csv또는sed -n l file.csv

그러면 다음과 같은 내용이 반환됩니다.

Val1,Val2,Val3,SomeVar^M$
Val1,Val2,Val3,ValNeeded^M$
Val1,Val2,Val3,Ignorevar^M$
$

이러한 문자를 모두 함께 제거하려면 ^M$일부 유틸리티를 사용할 수 있습니다. 예를 들어: dos2unix file.csv. 편집기 내에서 이를 수행하는 다른 방법이 있지만 더 많은 노력이 필요합니다.

파일을 변환하고 나면 문제가 없을 것입니다.

답변2

이는 MSDOS 줄 끝(캐리지 리턴 + 줄 바꿈)이 있는 파일의 일반적인 문제입니다. 캐리지 리턴은 보이지 않지만 비교할 문자열의 일부가 됩니다.

이미 길이가 잘못되었음을 발견했으며 tr -d ' '후행 공백을 제거하려고 했지만 문제는 공백이 아니었습니다. 인수 에 캐리지 리턴을 추가하기만 하면 됩니다 tr(다음을 입력하여 입력하세요 . ctrlVReturn표시됩니다 tr -d ' ^M'.)

관련 정보