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
シンプルに、およびを使用します。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
入力して入力します。 と表示されます)。ctrlVReturntr -d ' ^M'