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

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

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

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

Q&A

解決済

1回答

4104閲覧

awkのif文で複数の条件がある場合の書き方

grandchild

総合スコア10

シェルスクリプト

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

0グッド

0クリップ

投稿2022/02/18 03:26

下記のスクリプトで、日付が一致して、最後の文字列もAAだけのもを取り出したいのですが、
なぜか間違った結果(BBCをAAとして出力)を出します。
正しい抽出方法を教えてください。
どうぞよろしくお願いいたします。

<スクリプト>

#!/bin/bash
date=20220101
date_e=20220129
until [[ $date > ${date_e} ]]; do
awk -F'[ :/,"]+' '(sprintf("%04d%02d%02d", $1, $2, $3) == date && $6="AA"){print $1,$2,$3,$6}' date="$date" input.csv
date=$(date -d "$date + 1 day" '+%Y%m%d')
done

<入力ファイル>
Date,x,y,Type
2022/1/19,22.3,33.4,AA
2022/1/3,39.0,33.235,BBC

<出力結果>
2022 1 3 AA
2022 1 19 AA

<期待している出力結果>
2022 1 19 AA

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

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

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

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

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

grandchild

2022/02/18 03:29

なお、$6="AA"を$6=="AA"に書き換えると、何も出力されませんでした。
melian

2022/02/18 03:37

手元の環境で $6=="AA" に変更して実行してみると、2022 1 19 AA のみ表示されました。
melian

2022/02/18 03:51

awk -F'[ :/,"]+' を awk -F'[:/,"]+' に変更すると(スペースを入れない)どうなりますか?
grandchild

2022/02/18 04:14

スペースを入れないで試してみましたが、やはり何も出力されませんでした。
melian

2022/02/18 04:21

それでは awk -F'[ :/,"]+' '{print $6}' input.csv を実行した場合に AA と BBC が表示されますでしょうか?
grandchild

2022/02/18 04:27

AA BBC AA BBC AA BBC が日数分繰り返されました。
grandchild

2022/02/18 04:29

ところが awk -F'[ :/,"]| +' '{print $1,$2,$3,$6}' date="$date" input.csv とすると空白行はなく、下記のように繰り返されました。 2022 1 19 AA 2022 1 3 BBC 2022 1 19 AA 2022 1 3 BBC 2022 1 19 AA 2022 1 3 BBC 2022 1 19 AA 2022 1 3 BBC
grandchild

2022/02/18 04:38

申し訳ございません。一つ上の私のコメントは、ヘッダーを削除した場合の結果でした。 ヘッダーを残すと下記の繰り返しになりました。 Date x y 2022 1 19 AA 2022 1 3 BBC
melian

2022/02/18 04:39

思い当たることがありました。もしかして、input.csv の改行コードは "\r\n" になっていないでしょうか?
grandchild

2022/02/18 04:43

なっているようです。 od -c input.csvですと 0000000 D a t e , x , y , T y p e \r \n 2 0000020 0 2 2 / 1 / 1 9 , 2 2 . 3 , 3 3 0000040 . 4 4 4 4 4 4 4 4 4 4 4 4 4 , A 0000060 A \r \n 2 0 2 2 / 1 / 3 , 3 9 . 0 0000100 , 3 3 . 2 2 2 2 2 2 3 3 3 3 3 2 0000120 2 2 , B B C \r \n 0000130
melian

2022/02/18 04:45

それでしたら辻褄が合います。本来であれば "\n" のみに変換するのがよいのですが、 $6=="AA\r" とすればマッチする様になるはずです。
grandchild

2022/02/18 04:50

いけました!ありがとうございます!
guest

回答1

0

ベストアンサー

$6="AA"

比較せず代入しています。==ですね。

投稿2022/02/18 04:45

otn

総合スコア84423

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

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

grandchild

2022/02/18 04:47

申し訳ありません。質問の補足のところに==とした場合は何も表示されないことも追記しておりました。
otn

2022/02/18 04:48

失礼。 修正依頼で指摘済みでしたね。
otn

2022/02/18 04:53

melianさん指摘のように改行コードの問題であれば、 awk $'-F[ :/,"\r]+' で、\r もセパレーターに入れてしまえば良いかと思います。$'~~'が \r や \n のような記法を書く手段です。
grandchild

2022/02/18 05:01

ありがとうございます。解決しました。 melianさん、otnさん、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問