1

15000行のCSVファイルがあります。リストから不要な製品/メーカーを削除したい。メーカーとソースCSVファイルのリストがあります。

sedが適切であることがわかりましたが、私はループにぶら下がっています。

while read line
do
    unwanted = $
sed "|"$unwanted|d" /home/arno/pixtmp/pixtmp.csv >/home/arno/pixtmp/pix-clean.c$
done < /home/bankey/shopimport/unwanted.txt

どんな助けでも大歓迎です。

入力ファイル:

消耗品;Inktpatronenvoorプリンター;Inktvoorプリンター;B0137790;HP; Packket 2 inktpatronen No339-Zwart + PapierGoodway-80g/m²-A4-500vel;Dit pakket van 2 inktpatronen nr 339 zijn ontworpen voor uw HP printer en Leberen af vankwaliteit。;47.19;6.99; 47.19; http://pan8.fotovista.com/dev/8/5/32150358/l_32150358.jpg;在庫あり; 0.2; 0.11201; 9.99 ;; C9504EE; 0 ;;

4

3 に答える 3

1

sedは2つのステップで使用します:

  1. sed不要な情報からスクリプトを作成します。
  2. 作成したスクリプトをデータファイルに適用します。

それは次のようになります。

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
于 2013-01-21T00:52:56.813 に答える
0

各ループサイクルで前のサイクルの出力ファイルが入力ファイルとして使用されることを確認する必要があります。そうしないと、元のファイルの内容から最後の不要なレコードを差し引いた内容で出力ファイルが上書きされ続けます。

sedコマンドがインライン編集(オプション)をサポートしている場合は、次の-iように実行できます。

cp /home/arno/pixtmp/pixtmp.csv /home/arno/pixtmp/pix-clean.csv
while read line; do
  sed -i "/$line/d" /home/arno/pixtmp/pix-clean.csv
done < /home/bankey/shopimport/unwanted.txt

それ以外の場合は、一時ファイルを自分で処理する必要があります。

cp /home/arno/pixtmp/pixtmp.csv /home/arno/pixtmp/pix-clean.csv
while read line; do
  sed "/$line/d" /home/arno/pixtmp/pix-clean.csv >/home/arno/pixtmp/pix-clean.c$
  mv -f /home/arno/pixtmp/pix-clean.c$ /home/arno/pixtmp/pix-clean.csv
done < /home/bankey/shopimport/unwanted.txt
于 2013-01-20T23:40:52.127 に答える
0

sedよりも適していませんawk。たとえば、入力ファイルと不要な用語のリストがスペースで区切られていると仮定すると、次のように簡単に実行できます。

awk 'NR==FNR { a[$0]++ } NR != FNR && !a[$1]' undesired input

これにより、ファイル'input'ファイルが出力され、最初の列がファイル内の行と一致する行は省略されますundesired

于 2013-01-21T00:33:44.643 に答える