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
簡単に保ち、次の例では使用します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
。エディタでこれを行うには他の方法がありますが、より多くの努力が必要です。
ファイルを変換したら、作業を続行できます。
答え2
これは、MSDOS行末(キャリッジリターン+改行)があるファイルの一般的な問題です。キャリッジリターン文字は見えませんが、比較される文字列の一部になります。
長さエラーが見つかりました。あなたのtr -d ' '
意図は末尾のスペースを削除することでしたが、問題はスペースではありません。パラメータにキャリッジリターンを追加するだけですtr
(次のように入力して入力してくださいctrlV。Return)tr -d ' ^M'
。