※当サイトの記事には、広告・プロモーションが含まれます。

シェルスクリプトで空行(改行のみ)のみは空ファイルと判定されない罠

gigazine.net

非営利の慈善団体・GiveDirectlyは2016年からケニアで、数万人が参加する世界最大規模のベーシックインカムの実験を行っています。マサチューセッツ工科大学の経済学者であるタヴニート・スリ氏と同じく経済学者で2019年にノーベル経済学賞を受賞したアビジット・バナジー氏がこの実験の内容から、ベーシックインカムをどのような形で行うのがよいかという知見を明らかにしています。

世界最大規模のベーシックインカム実験でわかったことは? - GIGAZINE

アニャンゴさんの言うとおり、事業を行うにあたっては大金が必要となるため、一括給付の方が利便性が高いのですが、一方でベーシックインカムを毎月受け取っていた人は、一括で受け取っていた人に比べて概して幸福度が高く、精神的な健康状態がよかったこともわかりました。特に、長期受給グループの場合は「給付が12年続く」という精神衛生上のメリットが大きかったとのこと。スリ氏は「一括で給付を受けたグループは『何かに投資しなければ』ということがストレスになったかもしれない」と推測しています。

世界最大規模のベーシックインカム実験でわかったことは? - GIGAZINE

⇧ やはりと言いますか、お金の心配が神経をすり減らすということが証明されましたね。ベーシックインカム受給してストレスフリーな生活したいですな。

シェルスクリプトで空行(改行のみ)のみは空ファイルと判定されない罠

Linuxシェルスクリプトでテキストファイルに何も書き込まれていないか判定したかったのだけど、シェルスクリプトの場合、

  • 空ファイルではない
    1. 空行(改行のみ)のみ
    2. 空行(改行のみ)以外
    3. 空行(改行のみ)を含む何かしらの文字列

ということらしく、改行のみであっても、空ファイルではないという判定になってしまうというね...

じゃあ、テキストファイルに何も書き込まれていないかどうかってどう判定するん?

www.creatology.jp

blog.unfindable.net

⇧ 上記サイト様にありますように、

  1. 空行のみの行数、または、空行を除いた行数をカウント
  2. 総行数をカウント

を算出して、

  • 1と2の行数に差分あり
    →空行以外の行が含まれる、または、空行の行が含まれる
  • 1と2の行数に差分なし
    →全ての行数が空行、または、全ての行数が空行以外

差分を比較するしかないのかなと。

改行コードで「CRLF」も考慮すると、

askubuntu.com

⇧ 上記サイト様にありますように、

grep -c '^\s*$' [テキストファイル]

⇧ という感じにする必要があるっぽい。

で、空行が不要であるならば、

ex1.m-yabe.com

⇧ 上記サイト様にありますように、sedコマンドで空行のみを削除もできるようです。

改行のみであっても、空ファイルというわけでは無いってことは、なかなか直感的には受け入れ難いんですが、コンピューター的には、改行コードが書き込まれているってことになるってことなんですな。

というわけで、改行コードが、

  • LF
  • CRLF

の2つのテキストファイルを用意しておいて、以下のシェルスクリプトで行数を取得してみる。

#!/bin/bash

LF_NOT_ONLY_EMPTY_ROWS=empty_rows.txt
LF_ONLY_EMPTY_ROWS=only_empty_rows.txt

CRLF_NOT_ONLY_EMPTY_ROWS=crlf_empty_rows.txt
CRLF_ONLY_EMPTY_ROWS=crlf_only_empty_rows.txt

# 改行コードがLF
lf_empty_rows_for_not_only=$(grep -c '^\s*$' ${LF_NOT_ONLY_EMPTY_ROWS})
lf_total_rows_for_not_only=$(grep '' ${LF_NOT_ONLY_EMPTY_ROWS} | wc -l)

lf_empty_rows_for_only=$(grep -c '^\s*$' ${LF_ONLY_EMPTY_ROWS})
lf_total_rows_for_only=$(grep '' ${LF_ONLY_EMPTY_ROWS} | wc -l)

# 改行コードがCRLF
crlf_empty_rows_for_not_only=$(grep -c '^\s*$' ${CRLF_NOT_ONLY_EMPTY_ROWS})
crlf_total_rows_for_not_only=$(grep '' ${CRLF_NOT_ONLY_EMPTY_ROWS} | wc -l)

crlf_empty_rows_for_only=$(grep -c '^\s*$' ${CRLF_ONLY_EMPTY_ROWS})
crlf_total_rows_for_only=$(grep '' ${CRLF_ONLY_EMPTY_ROWS} | wc -l)

# 改行コードがLFの結果
echo '[lf_empty_rows_for_not_only_empty]'"${lf_empty_rows_for_not_only}"
echo '[lf_total_rows_for_not_only_empty]'"${lf_total_rows_for_not_only}"

echo '[lf_empty_rows_for_only_empty]'"${lf_empty_rows_for_only}"
echo '[lf_total_rows_for_only_empty]'"${lf_total_rows_for_only}"

# 改行コードがCRLFの結果
echo '[crlf_empty_rows_for_not_only_empty]'"${crlf_empty_rows_for_not_only}"
echo '[crlf_total_rows_for_not_only_empty]'"${crlf_total_rows_for_not_only}"

echo '[crlf_empty_rows_for_only_empty]'"${crlf_empty_rows_for_only}"
echo '[crlf_total_rows_for_only_empty]'"${crlf_total_rows_for_only}"
    

⇧ で、実行すると、

⇧ 改行コードが「LF」と「CRLF」のどちらのテキストファイルについても、空行をカウントできてそうです。

まぁ、空行は問答無用で削除するのが一般的なのか分からないのですが、ネットの情報で空行をカウントするって情報はほとんど見当たらないのよね...

毎度モヤモヤ感が半端ない...

今回はこのへんで。