Bus errorとSegmentation faultに困ったら見るブログ

物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

【シェルスクリプト】ファイルを1行ずつ読み込んで処理する

(元記事 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をダブルコーテーションで囲まないと、そこが空っぽのときにおかしくなるので注意

 

あとは

hoge=`echo $line | awk '{print $1}'`

とかを使ってそれぞれの値を取り出して処理する感じでOK

 

---------------------


(2017/1/18 追記)
上に書いてあるwhile文でデータを読み込むときに、空行を無視する書き方を改めて調べた
というか、この記事のことはまったく忘れていて追記しようと開いたら書いてあった・・・

けど少しだけ書き方が違うのでメモメモ

 

while read line
do
if [ ${#line} -eq 0 ]; then
continue
fi

# do something
echo "hoge"
done <hoge.txt

 

----------

 

(2017/6/12 追記)

 

空行だけじゃなくて、コメント行も無視するようにするには次のようにすればOK

#!/bin/sh

grep -v '^\s*#' hoge.txt |grep -v '^\s*$' > tmp.txt
while read line; do
 
 # ここでなんか処理する
 echo $line

done < tmp.txt
本当はtmp.txtとか中間ファイルを作りたくなくて、
done < `grep -v '^\s*#' hoge.txt |grep -v '^\s*$'`

 


で行けるかと思ったけどなんか動かなかった・・・
なにか大きな勘違いをしてるのかもしれん

 

■ 参考 : grepでコメント行および空白行を削除する

---------------

 

(2018/09/19 追記)

grepで検索条件を満たすものを結果から除外したいとき
(= 検索条件を満たさないものを表示したいとき)

grep -v "hoge" *.txt