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
(다음을 입력하여 입력하세요 . ctrlV로 Return표시됩니다 tr -d ' ^M'
.)