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

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

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

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

Q&A

解決済

3回答

533閲覧

awkでファイルから読んだ数値と文字列変数の一致時の出力方法

grandchild

総合スコア10

シェルスクリプト

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

0グッド

0クリップ

投稿2022/02/17 10:35

下記のスクリプトで動くのですが、awkのところ、別の表現がないでしょうか?

※実はほぼ同じことをしているのに、別のデータできちんと動かないことがあり、
もしかしたら、数値と文字列が違っていても自動で解釈してくれる場合とそうでない場合があるような気がしております。

#!/bin/bash date=20211201 date_e=20220228 while [ 1 ] ; do yy=`echo $date | cut -c 1-4` mm=`echo $date | cut -c 5-6` dd=`echo $date | cut -c 7-8` awk -F'[ :/,"]' '($1==yy && $2==mm && $3==dd){print $4}' yy="$yy" mm="$mm" dd="$dd" input.txt if [ $date = $date_e ] ; then break fi date=`date -d "$date 1day" "+%Y%m%d"` done

入力データ
2021 12 9 70
2021 12 24 65
2022 1 3 45
2022 2 5 90
2022 2 12 80
2022 2 24 70

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

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

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

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

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

grandchild

2022/02/18 02:38

質問をシンプルにするために省略していましたが、実際は下記のような感じで、別のところ($4=”A”)でひっかかっているようです。本来は別の質問を立ち上げるべきなのかもしれませんが、補足させていただきます。皆様、とても参考になりました。ありがとうございました。 <スクリプト> #!/bin/bash date=20211201 date_e=20220228 while [ 1 ] ; do yy=`echo $date | cut -c 1-4` mm=`echo $date | cut -c 5-6` dd=`echo $date | cut -c 7-8` awk -F'[ :/,"]' '($1==yy && $2==mm && $3==dd && $4=="A"){print $4}' yy="$yy" mm="$mm" dd="$dd" input.txt if [ $date = $date_e ] ; then break fi date=`date -d "$date 1day" "+%Y%m%d"` done <入力データ> 2021 12 9 70 A 2021 12 24 65 B 2022 1 3 45 C 2022 2 5 90 D 2022 2 12 80 E 2022 2 24 70 F
grandchild

2022/02/18 02:52

この$4は$5の間違いでした。また、print $5です。重ね重ねすみません。 引っかかっているのは、$5=="A"とした場合と$5="A"とした場合に、後者であれば出力はしてくれるのですが、なぜか数字の1が出力されます。
grandchild

2022/02/18 02:56

記を踏まえ、別の質問をこれから投稿しますので、こちらへのお返事は不要です。申し訳ございません。
guest

回答3

0

ベストアンサー

bash

1#!/bin/bash 2 3date=20211201 4date_e=20220228 5 6until [[ $date > ${date_e} ]]; do 7 awk -F'[ :/,"]' 'sprintf("%04d%02d%02d", $1, $2, $3) == date{print $4}' date="$date" input.txt 8 date=$(date -d "$date + 1 day" '+%Y%m%d') 9done

投稿2022/02/17 11:47

編集2022/02/17 12:32
melian

総合スコア19798

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

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

grandchild

2022/02/18 01:48

ありがとうございます。 下記のエラーが出るのですが、解決することは可能でしょうか? test2.sh: 6: [[: not found
melian

2022/02/18 01:49

bash で実行して下さい。 $ bash test2.sh
melian

2022/02/18 01:52

もしかして Mac OSX にデフォルトでインストールされている bash 3.x をお使いでしょうか?
grandchild

2022/02/18 01:53

ありがとうございます。上記のエラーが出なくなりました。 確認してみます。
guest

0

※実はほぼ同じことをしているのに、別のデータできちんと動かないことがあり、

区切りの空白の数が違うとか。
-F'[ :/,"]+'にしてみましょう。もしくは-F'[:/,"]| +'か。

投稿2022/02/17 11:27

otn

総合スコア84555

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

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

otn

2022/02/17 12:08

あるいは、先行するゼロが付いているとか。 2022 01 03 45 みたいな。
grandchild

2022/02/18 01:48

ありがとうございます。参考になりました。 ただ、なぜか解決はしませんでした。
otn

2022/02/18 01:53

データを見比べて違いを特定しましょう。
grandchild

2022/02/18 01:54

承知しました。確認してみます。
guest

0

動かしてませんが、考え方はこんなかんじでいいかな?

sh

1#!/bin/bash 2date=20211201 3date_e=20220228 4while [ 1 ] ; do 5 awk -F'[ :/,"]' '{d1=ymd*1;d2=$1*10000+$2*100+$3;if(d1==d2)print $4}' ymd="$date" input.txt 6 if [ $date = $date_e ] ; then 7 break 8 fi 9 date=`date -d "$date 1day" "+%Y%m%d"` 10done

投稿2022/02/17 11:18

takasima20

総合スコア7458

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

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

grandchild

2022/02/18 02:31

ありがとうございます。このような方法もあるんですね。参考になりました。 ただ、質問への追記で補足しますが、私の質問が悪かったようで、別のところで引っかかっているようです。
grandchild

2022/02/18 02:56

上記を踏まえ、別の質問をこれから投稿しますので、こちらへのお返事は不要です。申し訳ございません。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問