memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

macosのawkコマンドのエスケープシーケンスが変わってる!?

背景

研究でちょっとした自動化ツールを作っていて1時間くらいはまりました。覚えておきたいのでメモしておきます。

例えば、Macのターミナルで以下のようなコマンドを実行したとします。

cat result | awk '{print $1}'

resultというテキストファイルにツールの実行結果が入っていまして、その左から1列目($1)にコミットIDが入っているとします。

コミットIDが偶然にも指数表記の文字列になった場合(c399e99のe99の部分)、この結果をExcelに読み込むとe+99と10の99乗の数値として扱われてしまうんですね。。。

そこで、コミットIDは数値ではなく文字列だよとExcelに伝えるためにダブルクォーテーションで括ります。

プログラミング経験があればわかると思いますが、引用符の中で引用符を扱う場合にはエスケープシーケンスを使います。以下のような感じです。バックスラッシュを前につければいいんですね。

cat result | awk '{print \"$1\"}'

でも、これがエラーになる。。。なんでや?と思ったわけです。

ネットの記事にもこれでできるって書いている記事がたくさんあるのに。。。なぜかmacawkではできない。ちなみにChatGPTも同様の答えでした。

結論

対応方法は以下の記事に書いていました。

unix.stackexchange.com

置き換えたい文字列シンボル?としてdqを定義し、そのシンボルをprintの中で使います。

cat result | awk '{print dq$3dq}' dq='\"'

これでうまくダブルクォーテーションが表示されました。

なぜこうなのかはわかりませんが。。。とりあえず動きます。

2023/1/13追記

実は指数表記にダブルクォーテーションをつけてもExcelにTSVやCSVを読み込ませると指数表記になってしまうことがわかりました。。。ファイルを選択してExcelを開く方式では逃げられない(要はExcelの仕様)ようです。しかたがないので、コミットIDの先頭に半角下線をつけることにしました。これでキーとして使えるし勝手に数値(指数表記)にされなくなります。