一部のフィールドは無視され、他のフィールドは検証されるようにスクリプトを介して特定の名前のflatdbを渡そうとします。現在これが私が持っているものです。
コメントと空白行を無視するには、thenステートメントで何を使用する必要がありますか?
編集:ファイルを読む例
Bob,Brown,Smith,39
#Alex,Jay,Jones,83
Justin,Michael,White,18
James,Paul,Weis,54
編集:それから各名前を分けました。
IFS_SAVE=${IFS}
IFS=,
while read value1 value2 value3 value4
do
echo "First name ${value1}"
echo "Middle name ${value2}"
echo "Last name ${value3}"
echo "Age ${value4}"
done < ${1}
その後、ファイルの空行を無視しようとしました。
while read value1 value2 value3 value4
do
if [ -z ${value1} ]
then
echo "blank line exists"
fi
done < ${1}
その後、ファイル内のコメント付き行を無視しようとしました。
while read value1 value2 value3 value4
do
if [ "${value1:0:1}" = "#" ]
then
echo "comment exists"
fi
done < ${1}
ここからは実際には動作しませんでした。
フィールドが空白で始まるか終わるかを確認しようとしています。
while read value1 value2 value3 value4
do
if [[ ${value1} = *[[:space:]]* ]]
then
echo "space exist"
fi
done < ${1}
編集:理想的な出力
First name Bob
Middle name Brown
Last name Smith
Age 39
First name Justin
Middle name Michael
Last name White
Age 39
James,Paul,Wise,54 space exist
ベストアンサー1
read
あるいは、何百もの不適切なツールを繰り返すのではなく、テキスト処理ツールを使用してテキストを処理します。echo
。
ここで表形式のデータを処理するための確実な方法は次のとおりですawk
。
awk -F, -v OFS='\n' '
! /^[#[:space:]]/ {
print "First name " $1, \
"Middle name " $2, \
"Last name " $3, \
"Age " $4
}' < you-file
条件は、または! /^[#[:space:]]/
()で始まらない()行と一致します。!
^
#
スペース特徴。または、/^[^#[:space:]]/
以外の文字で始まる行を一致させることもできます。#
スペース実際には、空白行もスキップするか、&& NF == 4
4つのフィールドを含まないスキップ行に追加されます。
または、期待される出力からそのまま先行または末尾のスペースがある行を渡します。
awk -F, -v OFS='\n' '
/^[[:space:]]/ || /[[:space:]]$/ {print; next}
/^[^#]/ && NF == 4 {
print "First name " $1, \
"Middle name " $2, \
"Last name " $3, \
"Age " $4
}' < you-file
(ここでは、POSIX文字クラスがサポートされていないため、最初に見つかると予想されるハードコードされた空白文字のリストとしてPOSIX互換性をawk
想定してmawk
います。)[:space:]
mawk
また、キャリッジリターン文字(CR //とも呼ばれる\r
)は^M
1文字として扱われます[:space:]
。入力ファイルがUnixのように、行区切り文字がLFではなくCRLFであるMicrosoftオペレーティングシステムのテキストファイルである場合、各行は次のようになります。スペース特徴。dos2unix
Unix形式に変換するには、まずファイルを実行する必要があります。