Shell-Script
與 csv 文件值比較
我有一個 csv 文件,我需要將第 2 行第 4 列中的值與字元串進行比較。
範例 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
(即使長度不正確)。請讓我知道需要更改的地方。
這是具有 MSDOS 行結尾(輸入 + 換行)的文件的典型問題。輸入是不可見的,但將是要比較的字元串的一部分。
您已經發現長度錯誤,我想您
tr -d ' '
的目的是刪除尾隨空格,但問題不是空格。只需在您的參數中添加一個輸入tr
(通過鍵入ctrl``V
後跟Return
. 來輸入它。它將顯示為tr -d ' ^M'
.
雖然我將我的答案作為評論發布並且評論被刪除,但讓我們再試一次:
你接近它的方式是好的,但可以通過這樣一種方式改進,你不需要依賴太多的外部二進製文件。例如,要解決您的問題,您可以使用
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 已經提到的,您的文件包含 MSDOS 行結尾,也就是 CR/LF。
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
。在編輯器中還有其他方法可以做到這一點,但這需要更多的努力。轉換文件後,您應該會很好。