- PR -

○行ずつ処理したい!!

1
投稿者投稿内容
トーヤ
ベテラン
会議室デビュー日: 2003/06/12
投稿数: 63
投稿日時: 2003-07-30 17:37
トーヤです。

例えば以下のファイルを、3行ずつ読み込んで
それを加工するようなシェルスクリプトを
作成したいのですが、何かいい方法はありますか?

-----------------
111111
222222
333333
aaaaaa
bbbbbb
cccccc
ZZZZZZ
YYYYYY
XXXXXX
555555
666666
777777
-----------------
francis
会議室デビュー日: 2003/07/30
投稿数: 17
投稿日時: 2003-07-30 18:37
ちょっとややこしいですが、こんなカンジはダメですか?
ファイルnumから3行ずつ取り出してnum_[1-4]に書き込むんですが。

#!/bin/sh
COUNT=1
flag=1
for line in `cat num`
do
echo $line >> num_$COUNT
flag=$(($flag+1))
if [ $flag -gt 3 ] ; then
COUNT=$(($COUNT+1))
flag=1
fi
done

どちらかといえば初心者に近いので、僕にもご指導を!

行数の指定が出来るように変更しないといけないかな?

[ メッセージ編集済み 編集者: francis 編集日時 2003-07-30 18:38 ]

[ メッセージ編集済み 編集者: francis 編集日時 2003-07-30 18:39 ]
raccoon
ベテラン
会議室デビュー日: 2002/12/18
投稿数: 58
投稿日時: 2003-07-30 21:16
ども。raccoonです。

読み込んだ3行に対してどういう加工をしたいかにもよりますが・・・。
わたしならとりあえずawkですかね。

コード:
#! /bin/sh
FILE="hoge.txt"
awk ' BEGINE{ STR="" }
      { STR = STR $0 }
      { if((FNR % 3) == 0){ print STR ; STR = "" } } ' $FILE


'print STR'の部分にやりたい処理を書きます。
パイプやバッククォートを使って,awk以外のところで
やりたい処理をさせてもいいでしょう。

基本的にシェルスクリプトでは1行ずつしか処理してくれないので,
たいていの場合は『1行ずつ読んで,3回目だけ処理をする』
ということになるでしょう。
# francisさんの方法もそうですね。

sedあたりで3行ずつ読ませることもできるとは思いますが,
かなりムリヤリな方法になりそうな気がします。
# 識者ならキレイに作れるのかなぁ?
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-07-30 22:06
paste を使えば一発です。
コード:
% cat data
111111
222222
333333
aaaaaa
bbbbbb
cccccc
ZZZZZZ
YYYYYY
XXXXXX
555555
666666
777777
% cat sample.sh
#!/bin/sh
paste - - - |
while read a b c; do
  echo "$a:$b:$c"
done
% ./sample.sh < data
111111:222222:333333
aaaaaa:bbbbbb:cccccc
ZZZZZZ:YYYYYY:XXXXXX
555555:666666:777777

1

スキルアップ/キャリアアップ(JOB@IT)