私sed
は2つのステップで使用します:
sed
不要な情報からスクリプトを作成します。
- 作成したスクリプトをデータファイルに適用します。
それは次のようになります。
unwanted=/home/bankey/shopimport/unwanted.txt
datafile=/home/arno/pixtmp/pixtmp.csv
cleaned=/home/arno/pixtmp/pix-clean.csv
sed 's%.*%/,&,/d%' $unwanted > sed.script
sed -f sed.script $datafile > $cleaned
rm -f sed.script
の最初の呼び出しは、sed
不要なレコードを説明する各行の内容をsed
、データ行の中央にあるコンマ区切りフィールドとして削除するコマンドに置き換えるだけです。最初または最後にも不要なフィールドを処理する必要がある場合は、さらに努力する必要があります。また、スラッシュ、コンマ、引用符などが埋め込まれている可能性がある場合は、さらに努力する必要があります。の2回目の呼び出しでsed
は、最初の呼び出しで作成されたスクリプトがデータファイルに適用され、クリーンなファイルが生成されます。
スクリプトファイル名が一意であることを確認し、プロセスが中断された場合にスクリプトファイルをトラップすることで、これを改善できます。
tmp=$(mktemp /tmp/script.XXXXXX)
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15 # EXIT, HUP, INT, QUIT, PIPE, TERM
unwanted=/home/bankey/shopimport/unwanted.txt
datafile=/home/arno/pixtmp/pixtmp.csv
cleaned=/home/arno/pixtmp/pix-clean.csv
sed 's%.*%/,&,/d%' $unwanted > $tmp
sed -f $tmp $datafile > $cleaned
rm -f $tmp
trap 0 # Cancel the exit trap
GNUsed
を使用しますが、Mac OS X(BSD)sed
を使用しない場合は、次のように中間ファイルを回避できます。
unwanted=/home/bankey/shopimport/unwanted.txt
datafile=/home/arno/pixtmp/pixtmp.csv
cleaned=/home/arno/pixtmp/pix-clean.csv
sed 's%.*%/,&,/d%' $unwanted |
sed -f - $datafile > $cleaned
これは、sed
標準入力からスクリプトを読み取るように2番目に指示します。バージョン4.x(Mac OS Xでは標準ではありません)を使用している場合bash
は、代わりにプロセス置換を使用できます。
unwanted=/home/bankey/shopimport/unwanted.txt
datafile=/home/arno/pixtmp/pixtmp.csv
cleaned=/home/arno/pixtmp/pix-clean.csv
sed -f <(sed 's%.*%/,&,/d%' $unwanted) $datafile > $cleaned