2つのファイルを入力として使用するスクリプトがあります。
処理を開始するには、まずファイルの準備が必要です。
私の考えは、元のファイルに触れることなくすべてをコピーし、出力として必要なものを印刷し、コピーを削除することです。
ただし、このアプローチを使用すると、スクリプトに変数が多くなり、エラーが発生しやすくなります。
例:
#!/bin/bash
[[ -z $1 ]] && echo 'We need input file a' && exit 1;
[[ -z $2 ]] && echo 'We need input file b' && exit 1;
A_CSV=$1;
B_CSV=$2;
A_FILE="$A_CSV.tmp";
B_FILE="$B_CSV.tmp";
[ -f $A_FILE ]] && rm $A_FILE;
[[ -f $B_FILE ]] && rm $B_FILE;
tr -d "\r" < $A_CSV > $A_FILE;
tr -d "\r" < $B_CSV > $B_FILE;
awk '{ if(NR == 1) sub(/^\xef\xbb\xbf/,""); print }' $A_FILE > "$A_FILE.bck";
awk '{ if(NR == 1) sub(/^\xef\xbb\xbf/,""); print }' $B_FILE > "$B_FILE.bck";
rm $A_FILE && mv "$A_FILE.bck" $A_FILE;
rm $B_FILE && mv "$B_FILE.bck" $B_FILE;
# extra logic following the same pattern
更新を続けて名前を変更するためにコピーがどのように作成されるかを確認できます。
スクリプトエラーを減らすためにこれを改善する方法はありますか?
ベストアンサー1
これは|
パイプ()によって達成されます。世界には良いチュートリアルがたくさんあります。 これ。
#!/bin/bash
[[ -z $1 ]] && echo 'We need input file a' && exit 1;
[[ -z $2 ]] && echo 'We need input file b' && exit 1;
A_CSV=$1;
B_CSV=$2;
A_FILE="$A_CSV.tmp";
B_FILE="$B_CSV.tmp";
[ -f $A_FILE ]] && rm $A_FILE;
[[ -f $B_FILE ]] && rm $B_FILE;
tr -d "\r" < $A_CSV | awk '{ if(NR == 1) sub(/^\xef\xbb\xbf/,""); print }' > $A_FILE
tr -d "\r" < $B_CSV | awk '{ if(NR == 1) sub(/^\xef\xbb\xbf/,""); print }' > $B_FILE
個人的に、私は両方のファイルに対して同じことをするので、単一のタスクを処理する関数を作成したいと思います。 rm -f $A_FILE $B_FILE
私の考えは見るのにもっと良いと思います。