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

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

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

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

Q&A

解決済

3回答

5949閲覧

bashスクリプト内のawkにシェル変数を埋めたい

kamuycikap

総合スコア135

AWK

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

0グッド

1クリップ

投稿2020/06/13 23:24

編集2020/06/13 23:44

bashスクリプトを書いています。
bashスクリプト内にて、コマンドとしてawkを利用しています。

awk -F "," 'BEGIN{OFS=","} $2==${hogehoge} && $6==2 {print $0}' ./hogehoge.txt > result.txt

上記はシェルスクリプトの1行です。
結論から書きますと、シェル変数の${hogehoge}の展開がうまくいっていません。

本当は
hogehoge="2020/06/14 08:23:15"
cmd=$(awk -F "," 'BEGIN{OFS=","} $2==${hogehoge} && $6==2 {print $0}' ./hogehoge.txt)

のように、戻り値を変数に取り込みたいのですが・・・シェル変数の展開で失敗している模様。
シェル変数には、日付文字列が入っています。

どのように書けば実現できるのでしょうか?

■追加情報
awk -F "," 'BEGIN{OFS=","} $2=="'"2020/04/15 14:14:02"'" && $6==2 {print $0}' ./hogehoge.txt

このコマンドは通るようです。。。単純に展開されるだけではない??

さらにさらに、コマンドプロンプトで以下の順に実行すると通った。。。
$ kdate="2020/06/14"
$ awk -F "," 'BEGIN{OFS=","} $2=="'"${kdate}"'" && $6==2 {print $0}' ./hogehoge.txt

どうしてスクリプトファイルに書いたら動かない???のかますますわからなくなってしまいました。

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

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

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

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

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

dodox86

2020/06/13 23:50

確認ですが、要は同じ書き方でシェルスクリプトとして実行するとうまくいかない、と言うことでよいでしょうか。
kamuycikap

2020/06/13 23:57

ありがとうございます。 そうなのです。 コマンドプロンプトで動かすと、目的の行が標準出力に挙がってくるのですが、シェルスクリプトにするとダメなのです。
guest

回答3

0

awkのスクリプト中に、シェル変数やあるいはもっと込み入った物を渡すときは、awk変数に代入するのが簡単です。

sh

1hogehoge="2020/06/14 08:23:15" 2cmd=$(awk -F "," -v HOGE="${hogehoge}" 'BEGIN{OFS=","} $2==HOGE && $6==2 {print $0}' ./hogehoge.txt) 3または、 4cmd=$(awk -F "," 'BEGIN{OFS=","} $2==HOGE && $6==2 {print $0}' HOGE="${hogehoge}" ./hogehoge.txt)

投稿2020/06/14 00:44

otn

総合スコア84499

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

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

kamuycikap

2020/06/14 02:34

アドバイスありがとうございます。 なるほど、awkスクリプトの方に渡すのもすっきり来ます。 込み入ったものが必要になった時は、こちらの方法も活用させて頂きます。
guest

0

ベストアンサー

sh

1$ cat xx.sh 2#!/bin/sh 3hogehoge="2020/06/14 08:23:15" 4cmd=$(awk -F "," "BEGIN{OFS=\",\"} $2==\"${hogehoge}\" && $6==2 {print $0}" ./hogehoge.txt) 5 6$ sh -x xx.sh 7+ hogehoge=2020/06/14 08:23:15 8+ awk -F , BEGIN{OFS=","} $2=="2020/06/14 08:23:15" && $6==2 {print $0} ./hogehoge.txt 9+ cmd=

man sh https://nxmnpg.lemoda.net/ja/1/sh#8

引用 (クォート)
シングルクォート文字

シングルクォートのペアで囲まれた文字は、すべてその文字そのまま (リテラル) として扱われます (ただしシングルクォートは別です。シングルクォート で囲った文字列の中にシングルクォートを含めることはできません)。

ダブルクォート文字

ダブルクォートのペアで囲まれた文字は、ドル記号文字 ($) 、バッククォート文字 (`) 、バックスラッシュ文字 () を除き、すべてリテラルとして扱われます。 ダブルクォート文字による引用の中にあるバックスラッシュ文字は、歴史 的経緯によりすこし変わった扱いを受けます。 次の文字の前にある場合はクォートになりますが、 それ以外ではリテラルのままとなります:

$ ` " \ \n

投稿2020/06/14 00:05

shiketa

総合スコア3971

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

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

dodox86

2020/06/14 00:13

シェル変数のところだけ考えていましたが、本質問についてはこちらのご回答が適切ですね。引用符文字の扱い、展開に起因するものでした。
kamuycikap

2020/06/14 00:28

お二人とも、大変お世話になりました。 なるほど・・・・灯台下暗し。 マニュアルに書いてありました。 大変お恥ずかしい話で失礼致しました。 プログラムも無事に動作確認できましたので、これにて解決済みとさせていただきます。
guest

0

シェルスクリプトで実行すると別プロセスになってしまうので、親のシェル変数は子プロセスとして起動されたシェルスクリプトに引き継がれません。当該シェル変数をexportコマンドで環境変数として定義したあと、シェルスクリプトを起動するか、

bash

1$ export hogehoge 2$ ./hoge.sh

sourceコマンドまたは. でシェルスクリプトを起動し、同プロセス内で実行するようにしてください。

bash

1$ source ./hoge.sh 2 3$ . ./hoge.sh

投稿2020/06/14 00:03

dodox86

総合スコア9183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問