ここから本文です

シェルスクリプトについて質問です 以下はn行3列のcsvファイルを行ごとに読み取...

gor********さん

2016/12/1615:09:19

シェルスクリプトについて質問です
以下はn行3列のcsvファイルを行ごとに読み取って、first ,second ,thirdに列の値を読み取るものです。

if文を使って2行目の一列目の値をechoしたいのですがうまくいかないのですが、どこが間違っていますか?
#/bin/sh
csvfile=aaa.csv

for line in `cat ${aaa} | grep -v ~#`
do
first=`echo ${line} | cut -d ',' -f 1`
second=`echo ${line} | cut -d ',' -f 2`
third=`echo ${line} | cut -d ',' -f 3`
if [ line = 2 ]
then
AA="${first}"
echo $AA
fi
done

echo $?

閲覧数:
29
回答数:
1

違反報告

ベストアンサーに選ばれた回答

hyu********さん

2016/12/1620:13:34

いろいろ細かなミスがあります。

まず忘れてはいけない点として、
for line in `cat ${aaa} | grep -v ~#`
このように行情報を取得する場合は、
「IFSと呼ばれる変数に対して、改行(\n)区切りで取得するように設定してから、その設定をもとに戻す」
という作業を行う必要があります。これをしなければ、デフォルトではスペースと改行とタブスペースで区切られてしまいますので、カンマの隣にスペース等あると別の行として扱われてしまいます。
つまり、

IFS_org=$IFS #現在のIFSを記憶しておく
IFS=$'\n' #改行区切りで読むように設定
for line in `cat ${aaa} | grep -v ~#`
do
####なんらかの処理
done
IFS=$IFS_org #IFSを元に戻す

という操作が必要です。
(わかっていれば省略しても構いません。)


次に、
if [ line = 2 ]
について、line変数との比較を行いたいのなら$lineと書かなくてはなりませんし、
そもそも$lineに入っているのはある特定の行の文字列ですので、「= 2」となることはありません。
いくつか方法はありますが、今回のシェルスクリプトを生かすとすると、
「別途読み込んだ行数をカウントし、2行目かを比較する」という書き方に変更する必要があります。
つまり、

linecount=0 #行を数える変数を用意して初期化
for ~~~
do
linecount=`expr $linecount + 1` #読み込んだ行数を1増やす処理
###なんらかの処理
done

という実装が必要です。
※exprを用いる処理は重いです。

以上を踏まえて、他の軽微なミスを修正すると、以下のようになりますので参考にしてください。


#/bin/sh
csvfile=aaa.csv

IFS_org=$IFS ##現在の区切りを保存
IFS=$'\n' ##改行区切りに設定
linecount=0 ##行数カウンタ
#for line in `cat ${aaa} | grep -v ~#` ##aaa変数は定義されていません。
for line in `cat ${csvfile} | grep -v ~#` ##変数名修正
do
linecount=`expr $linecount + 1` ##行数カウントをインクリメント
first=`echo ${line} | cut -d ',' -f 1`
second=`echo ${line} | cut -d ',' -f 2`
third=`echo ${line} | cut -d ',' -f 3`
if [ $linecount = 2 ] ##行番号の比較
then
AA="${first}"
echo $AA
fi
done
IFS=$IFS_org ##IFSを元に戻す

echo $?

  • 質問者

    gor********さん

    2016/12/1816:48:06

    詳細な回答ありがとうございます。
    書き換えてプログラムを実行してみたのですが、echo $AAをした結果、30行すべての1列目の結果を返してきました。完全に特定の行の1列目を抽出することができませんでした。解決方法はないでしょうか?

  • その他の返信(3件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2016/12/19 19:18:40

解決できました!!
お世話になりました!
ありがとうございます!

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる