質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

2回答

1146閲覧

シェルスクリプトでawk関数を使用した一定間隔のデータの出力について

himuru

総合スコア12

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2019/05/12 07:43

ファイルの中身を特定の行間隔で別のファイルに出力するスクリプトを作成したいと考えております。

Databaseというファイルの中身を1行目から5行目をData_1というファイルに、6行目から10行目をData_2というファイルに順次、データを格納していきたいです。

そこで、以下のようなスクリプトを作成しました。

html

1#!/bin/sh 2 3Shift=0.6853347113 4 5echo "Database"; head Database 6 7for i in `seq 1 5 40` 8do 9 i_f=`expr $i + 4` 10 Data="Data_$i" 11 echo $Data $i $i_f 12 13 cat Database | awk -v foo=$Shift 'NR >= $i && NR <= $i_f {print $1-foo, $2, $3}' > $Data 14 15done 16 17cat Database | awk -v foo=$Shift 'NR >= 1 && NR <= 5 {print $1-foo, $2, $3}' > Opt.temp_1 18cat Database | awk -v foo=$Shift 'NR >= 6 && NR <= 10 {print $1-foo, $2, $3}' > Opt.temp_2 19 20echo "Opt.temp_1"; cat Opt.temp_1 21 22echo "Opt.temp_2"; cat Opt.temp_2 23 24

しかしながら、このスクリプトを実行したところ、Data_1やData_2には結果が出力されていませんでした。念のため、記載した一番下の2行のコードではきちんとファイルが出力されていました。

awkの部分のNRの記載方法が誤っているのかと思いますが、どのように記載すれば適切な結果が得られるのかが色々と調べてみたのですが、分かりません。

ぜひ、どなたか解決方法をご教授いただけますと幸いです。

また、以下が実行結果になります。

html

1$ ./Test.sh 2Database 3-0.149805 50.0000 11.24237579 4-0.149805 100.0000 11.24097601 5-0.149805 150.0000 11.24148530 6-0.149805 200.0000 11.24359005 7-0.149805 250.0000 11.24734614 8-0.149805 300.0000 11.25267809 9-0.149805 350.0000 11.25934993 10-0.149805 400.0000 11.26705581 11-0.149805 450.0000 11.27548189 12-0.149805 500.0000 11.28433724 13Data_1 1 5 14Data_6 6 10 15Data_11 11 15 16Data_16 16 20 17Data_21 21 25 18Data_26 26 30 19Data_31 31 35 20Data_36 36 40 21Opt.temp_1 22-0.83514 50.0000 11.24237579 23-0.83514 100.0000 11.24097601 24-0.83514 150.0000 11.24148530 25-0.83514 200.0000 11.24359005 26-0.83514 250.0000 11.24734614 27Opt.temp_2 28-0.83514 300.0000 11.25267809 29-0.83514 350.0000 11.25934993 30-0.83514 400.0000 11.26705581 31-0.83514 450.0000 11.27548189 32-0.83514 500.0000 11.28433724 33

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

どうせawkを使うならawkなスクリプトで全部済ませてしまったほうが圧倒的に簡単ではないでしょうか。

# test.awk BEGIN{ shift = 0.6853347113 } { outfile = sprintf("data_%d", (NR-1)/5) print $1-shift, $2, $3 >> outfile }

↑こんな感じのスクリプトを作成し、
↓こんな感じで実行。

awk -f test.awk Database

投稿2019/05/12 08:37

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

特定の行ごとの分割なら split コマンドの -l オプションを試してみてはいかがでしょうか。

投稿2019/05/12 08:17

scsi

総合スコア2840

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問