我有一個 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
There$NF
取得記錄中的最後一個欄位。
正如 Philippos 已經提到的,您的檔案包含 MSDOS 行結尾,又名 CR/LF。您可以使用 、 cat
、sed
和許多其他工具以不同的方式檢查這些內容,od
但讓我們保持簡單並在本例中使用cat
and :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'
。