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'. )

관련 정보