(元記事 2015/10/25)
あるディレクトリにあるファイルのリストに対して処理をするときはよく、
#!/bin/sh
for i in `ls *.txt`
do
echo $i
done
のような書き方を使う
今回は、あるファイルに書かれた各行に対してなんらかの処理をする場合、
#!/bin/sh
while read line; do
echo $line
done < $data1
さらにこのファイル$data1に空行が含まれている場合、そこだけ飛ばすようにしたいときは、
#!/bin/sh
while read line; do
if [ -n "$line" ]; then
echo $line
fi
done < $data1
$lineをダブルコーテーションで囲まないと、そこが空っぽのときにおかしくなるので注意
あとは
とかを使ってそれぞれの値を取り出して処理する感じでOK
---------------------
(2017/1/18 追記)
上に書いてあるwhile文でデータを読み込むときに、空行を無視する書き方を改めて調べた
というか、この記事のことはまったく忘れていて追記しようと開いたら書いてあった・・・
けど少しだけ書き方が違うのでメモメモ
while read line
do
if [ ${#line} -eq 0 ]; then
continue
fi
----------
(2017/6/12 追記)
空行だけじゃなくて、コメント行も無視するようにするには次のようにすればOK
#!/bin/sh
grep -v '^\s*#' hoge.txt |grep -v '^\s*$' > tmp.txt
while read line; do
# ここでなんか処理する
echo $linedone < tmp.txt
本当はtmp.txtとか中間ファイルを作りたくなくて、
done < `grep -v '^\s*#' hoge.txt |grep -v '^\s*$'`
で行けるかと思ったけどなんか動かなかった・・・
なにか大きな勘違いをしてるのかもしれん
---------------
(2018/09/19 追記)
grepで検索条件を満たすものを結果から除外したいとき
(= 検索条件を満たさないものを表示したいとき)