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

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

新規登録して質問してみよう
ただいま回答率
85.37%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

2回答

42141閲覧

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

ashly

総合スコア119

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

1クリップ

投稿2016/06/21 07:32

表題の通りなのですが、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

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

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

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

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

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

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

guest

回答2

0

配列を使う。

Bash

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

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

Bash

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

ファイルを経由する。

Bash

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

投稿2016/06/21 14:20

otn

総合スコア85766

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

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

ashly

2016/06/22 02:08

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

0

ベストアンサー

###案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 08:27

編集2016/06/21 08:43
TaichiYanagiya

総合スコア12173

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

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

ashly

2016/06/21 10: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;}')
TaichiYanagiya

2016/06/21 10:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問