下記のスクリプトで、日付が一致して、最後の文字列も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
なお、$6="AA"を$6=="AA"に書き換えると、何も出力されませんでした。
手元の環境で $6=="AA" に変更して実行してみると、2022 1 19 AA のみ表示されました。
awk -F'[ :/,"]+' を awk -F'[:/,"]+' に変更すると(スペースを入れない)どうなりますか?
スペースを入れないで試してみましたが、やはり何も出力されませんでした。
それでは
awk -F'[ :/,"]+' '{print $6}' input.csv
を実行した場合に AA と BBC が表示されますでしょうか?
AA
BBC
AA
BBC
AA
BBC
が日数分繰り返されました。
ところが 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
申し訳ございません。一つ上の私のコメントは、ヘッダーを削除した場合の結果でした。
ヘッダーを残すと下記の繰り返しになりました。
Date x y
2022 1 19 AA
2022 1 3 BBC
思い当たることがありました。もしかして、input.csv の改行コードは "\r\n" になっていないでしょうか?
なっているようです。
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
それでしたら辻褄が合います。本来であれば "\n" のみに変換するのがよいのですが、
$6=="AA\r"
とすればマッチする様になるはずです。
いけました!ありがとうございます!
回答1件
あなたの回答
tips
プレビュー