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

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

ただいまの
回答率

90.51%

  • Linux

    4444questions

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

  • シェルスクリプト

    160questions

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 61

himuru

score 2

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

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

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

#!/bin/sh

Shift=0.6853347113

echo "Database"; head Database

for i in  `seq 1 5 40`
do 
  i_f=`expr $i + 4`
  Data="Data_$i"
  echo $Data $i $i_f

  cat Database | awk -v foo=$Shift 'NR >= $i && NR <= $i_f {print $1-foo, $2, $3}' > $Data

done

cat Database | awk -v foo=$Shift 'NR >= 1 && NR <= 5 {print $1-foo, $2, $3}' > Opt.temp_1
cat Database | awk -v foo=$Shift 'NR >= 6 && NR <= 10 {print $1-foo, $2, $3}' > Opt.temp_2

echo "Opt.temp_1"; cat Opt.temp_1

echo "Opt.temp_2"; cat Opt.temp_2

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

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

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

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

$ ./Test.sh
Database
-0.149805 50.0000 11.24237579
-0.149805 100.0000 11.24097601
-0.149805 150.0000 11.24148530
-0.149805 200.0000 11.24359005
-0.149805 250.0000 11.24734614
-0.149805 300.0000 11.25267809
-0.149805 350.0000 11.25934993
-0.149805 400.0000 11.26705581
-0.149805 450.0000 11.27548189
-0.149805 500.0000 11.28433724
Data_1 1 5
Data_6 6 10
Data_11 11 15
Data_16 16 20
Data_21 21 25
Data_26 26 30
Data_31 31 35
Data_36 36 40
Opt.temp_1
-0.83514 50.0000 11.24237579
-0.83514 100.0000 11.24097601
-0.83514 150.0000 11.24148530
-0.83514 200.0000 11.24359005
-0.83514 250.0000 11.24734614
Opt.temp_2
-0.83514 300.0000 11.25267809
-0.83514 350.0000 11.25934993
-0.83514 400.0000 11.26705581
-0.83514 450.0000 11.27548189
-0.83514 500.0000 11.28433724
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Linux

    4444questions

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

  • シェルスクリプト

    160questions