シェルで文字列を操作する

シェルで文字列を操作する

私は、作業中のXMLの1つへの入力として使用できるように、特定の形式の文字列を生成するシェルスクリプトを作成しています。

次の形式の入力ファイルが提供されます。<attribute field>,<data_type>,<size>

instanceid,varchar,256
sysdate,date
status,number
notes,varchar,4000
created_on,date

「チェックサム」を変数(例:md5( INSTANCEID || STATUS || NOTES)Or'd)のフィールド以外のすべてのプロパティフィールドに保存したいと思います。

私が書いたスクリプトはこれです

IFS=$'\n'
file=$(cat source.txt)
line_number=$(cat source.txt | wc -l)
checksum="md5( "
for line in $file
do
let line_number=line_number-1
data_field=$(echo $line | cut -f1 -d','| tr "a-z" "A-Z")
data_type=$(echo $line | cut -f2 -d',' | tr "a-z" "A-Z")
if [ $data_type != "DATE" ]  && [ $line_number -gt 0 ]
  then checksum+="$data_field || "
elif [ $data_type != "DATE" ] && [ $line_number -eq 0 ]
  then checksum+=" $data_field "
fi
done
checksum+=")"
echo $checksum

このスクリプトは、日付型の属性を持つ最後の行を除くすべての入力シナリオで機能します。

この場合、変数の値は次のようになります。md5( INSTANCEID || STATUS || NOTES || )

最後の行が日付であることを確認するためにコマンドを試しましたが、最後の行が日付タイプのtail場合は再び失敗します。

||最後のアイテムをどのように削除できますか?

ベストアンサー1

checksum="${checksum% || })"代わりに速い答えはですchecksum+=")"。各ステップで無条件文字列を追加し、||最後に不要な最後の文字列を削除するだけです(したがって、line_numberもう計算は不要です)。

より良い方法は

awk -F, 'BEGIN { printf "md5( " } 
         toupper($2) != "DATE" { printf "%s%s", sep, toupper($1); sep = " || " }
         END { print ")" }' source.txt

おすすめ記事