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

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

ただいまの
回答率

87.95%

シェルのawk内で定義した変数や結果をAwk外で取り扱いたい

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 31K+

score 103

表題の通りなのですが、AWKでテキスト処理を行った結果をAWK外で扱いたいです。

test.txt は以下のようにタテ並びの数字が羅列されており、これらの行を全て足した値を sum sum2に代入し次の処理を行いたいのですが、変数に計算された結果が入らなく困っております。

test.txt

111  222
333  333
444  444


cat test.txt | awk '{print $1, $2}' | awk '{sum+=$1;sum2+=$2;}END{sum=sum; sum2=sum2;}'

echo $sum
echo $sum2

初歩的な内容で申訳ありませんがアドバイス頂けると助かります。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

案1. awk の出力値を変数に入れる

sum=`awk '{sum+=$1}END{print sum}' test.txt`
sum2=`awk '{sum2+=$2}END{print sum2}' test.txt`
echo $sum
echo $sum2

案2. aws の出力を eval で評価する

eval `awk '{sum+=$1;sum2+=$2}END{printf("sum=%d ; sum2=%d",sum,sum2)}' test.txt`
echo $sum
echo $sum2

案3. read とリダイレクトとプロセス置換を使う

read sum sum2 < <(awk '{sum+=$1; sum2+=$2}END{print sum,sum2}' test.txt)
echo $sum
echo $sum2


bash では動きますが、sh では動きません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/21 19:02

    有り難うございます!

    1案はシンプルでいいのですが、今回読み込むファイル(ここではtest.txt)が非常に大きいため、1回の読み込みで同時に合計値をだすように記載する必要がありました。

    その場合2と3が良さそうなのですが、実はこのテキストファイルは途中様々なコマンドをパイプして整形しており既に整形されたファイルがあるわけではないのです。。

    そのため、

    cat test.txt | 何かしらの処理 | 何かしらの処理 | awk '{sum+=$1;sum2+=$2;}END{print sum,sum2;}'

    というように結果を次のコマンドに渡す必要があるのですが、その場合2や3の書き方はどのようになりますでしょうか。

    ためしに、以下のように記載してみたのですがシンタックスエラーとなってしまいました。

    cat test.txt | 何かしらの処理 | 何かしらの処理 | awk '{sum+=$1;sum2+=$2;}END{print sum,sum2;}' | read test test2

    cat test.txt | 何かしらの処理 | 何かしらの処理 | read test test2 < < (awk '{sum+=$1;sum2+=$2;}END{print sum,sum2;}')

    キャンセル

  • 2016/06/21 19:21

    read sum sum2 < <( コマンド | コマンド | ... | aws ... )

    キャンセル

+1

配列を使う。

A=(`cat test.txt | 何かしらの処理 | awk '{sum+=$1;sum2+=$2;}END{print sum,sum2;}'`)
sum=${A[0]}
sum2=${A[1]}


位置パラメータを使う(配列機能が無いshでも使える)。

set -- `cat test.txt | 何かしらの処理 | awk '{sum+=$1;sum2+=$2;}END{print sum,sum2;}'`
sum=$1
sum2=$2


ファイルを経由する。

cat test.txt | 何かしらの処理 | awk '{sum+=$1;sum2+=$2;}END{print sum > "sum.txt";print sum2 > "sum2.txt";}'
read sum < sum.txt
read sum2 < sum2.txt

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/22 11:08

    ありがとうございます。 2番目の位置パラメータの構文で解決しました。

    キャンセル

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

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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