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 がすでに述べたように、ファイルには 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。エディター内からこれを行う方法は他にもありますが、より多くの労力が必要です。

ファイルを変換したら、問題は解決するはずです。

答え2

これは、MSDOS の行末 (復帰 + 改行) を持つファイルによく見られる問題です。復帰は表示されませんが、比較する文字列の一部になります。

長さが間違っていることはすでにわかっており、tr -d ' '末尾のスペースを削除するつもりだったと思いますが、問題は空白ではありませんでした。引数にキャリッジ リターンを追加するだけです(とtr入力して入力します。 と表示されます)。ctrlVReturntr -d ' ^M'

関連情報