概要
Linuxにて区切り文字で区切ったファイルにて、
全行全項目が漏れなく文字が入っているか確認したかったんですが、ありそうで見つからなかったので作成しました。
なお、制限として/bin/shを条件として作成しています。bashなどであれば、別の方法もあるでしょう。
※本稿ではあくまで文字列や値が入っているかの確認のみで入力された文字列内容などの判定はありません
例(区切り文字がカンマかつ1行1つの区切り文字の場合)
ファイルの例(1行1つの区切り文字)
AAA,BBB
CCC,DDD
EEE,FFF
FILE=<ファイル名>
# ファイル内の区切り文字全数 # Total number of delimiters in file
CNT1=$(grep -oR "\," $FILE |wc -l)
# 区切り文字を改行に変換した行全数。それを1/2。 # The total number of lines with delimiters converted to newlines. 1/2 it.
CNT2=$(expr $(cat $FILE |tr '\,' '\n' | grep . |wc -l) / 2)
# 行全数 #all lines
CNT3=$(grep . $FILE |wc -l)
#
if [ $CNT1 -ne $CNT2 ] || [ $CNT1 -ne $CNT3 ] ; then
echo "The comma in the File is incorrect."
fi
基本上記3つのカウントは同数となります。(同数にならなければエラーメッセージということで)
説明1(CNT1)
# ファイル内の区切り文字全数 # Total number of delimiters in file
CNT1=$(grep -oR "\," $FILE |wc -l)
以下のように余計な区切り文字がある場合の判定に利用しています。(連続していたり末尾にあったり)
1行に1区切り文字の前提なので、全行数=ファイル内の全区切り文字です。
以下の場合だとCNT1の数だけ多くなって、CNT2,CNT3と一致せずエラーです。
AAA,BBB,
CCC,,DDD
EEE,FFF
説明2(CNT2)
# 区切り文字を改行に変換した行全数。それを1/2。 # The total number of lines with delimiters converted to newlines. 1/2 it.
CNT2=$(expr $(cat $FILE) |tr '\,' '\n' | grep . |wc -l) / 2)
以下のように区切り文字で区切ったのに未入力だった場合の判定です。
AAA,
CCC,DDD
,FFF
↓ 区切り文字を改行に変換後
AAA
CCC
DDD
FFF
「grep . |wc -l」で空白行は除外した行数がカウントされるので、4行。そこから1/2すると2となり、全行数と一致せずエラーとなります。
5 /2 でも expr は切り捨てで2になるので、問題なし。
おまけ 例(区切り文字がカンマかつ1行2つの区切り文字の場合)
AAA,BBB,CCC
DDD,EEE,FFF
GGG,HHH,III
FILE=<ファイル名>
# ファイル内の区切り文字全数。それを1/2。 # Total number of delimiters in file. 1/2 it.
CNT1=$(expr $(grep -oR "\," $FILE |wc -l) / 2)
# 区切り文字を改行に変換した行全数。それを1/3。 # The total number of lines with delimiters converted to newlines. 1/3 it.
CNT2=$(expr $(cat $FILE |tr '\,' '\n' | grep . |wc -l) / 3)
# 行全数 #all lines
CNT3=$(grep . $FILE |wc -l)
#
if [ $CNT1 -ne $CNT2 ] || [ $CNT1 -ne $CNT3 ] ; then
echo "The comma in the File is incorrect."
fi
注意事項
ファイルの改行コードがLFの場合は問題なく動作しますが、WindowsやMacからアップロードしたファイルを利用する際は改行コードがCRLFやCRとなり、想定動作とならないので、お気を付けを。
CRが"grep ."で空白行と見なされないのが原因で1行と認識されることに起因されるので、実行前にLFに置換する処理を入れれば問題ありません。