csvファイル値と比較

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(長さが正しくない場合でも)。

何を変えるべきか教えてください。

ベストアンサー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簡単に保ち、次の例では使用します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。エディタでこれを行うには他の方法がありますが、より多くの努力が必要です。

ファイルを変換したら、作業を続行できます。

おすすめ記事