與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,長度varcsv10(甚至長度不正確)。

請告訴我哪裡需要更改。

答案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。您可以使用 、 catsed和許多其他工具以不同的方式檢查這些內容,od但讓我們保持簡單並在本例中使用catand :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'

相關內容