Shell-Script

與 csv 文件值比較

  • October 22, 2021

我有一個 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和長度varcsv10(即使長度不正確)。

請讓我知道需要更改的地方。

這是具有 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但讓我們保持簡單並使用catsed在這種情況下:

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。在編輯器中還有其他方法可以做到這一點,但這需要更多的努力。

轉換文件後,您應該會很好。

引用自:https://unix.stackexchange.com/questions/674337