2013-01-20 58 views
1

我有一個15000行的CSV文件。從列表中我想刪除不需要的產品/製造商。我有一個製造商和源CSV文件的列表。howto loop sed獲取變量

我發現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 

任何幫助表示讚賞。

Inputfile中:

消耗品; Inktpatronen VOOR打印機;的iNKT VOOR打印機; B0137790; HP; Pakket 2 inktpatronen No339 - 茲瓦特+紙業順行 - 爲80g /平方米 - A4 - 500 VEL;秩pakket麪包車2 inktpatronen NR 339 zijn ontworpen voor uw HP printer en leveren afdrukken van kwaliteit。; 47.19; 6.99; 47.19; http://pan8.fotovista.com/dev/8/5/32150358/l_32150358.jpg; in stock; 0.2; 0.11201; 9.99 ;; C9504EE; 0 ;;

+0

您可以顯示輸入文件和預期輸出的內容是什麼? – cmbuckley

+1

聽起來像典型的awk工作。但沒有輸入/預期輸出,很難找到起點。 – Kent

+0

@JonathanLeffler我搞清楚哪一個實際上是最好的......但tnx的建議.. –

回答

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 
+0

tnx..someting這樣我也想出了..也很好..在此期間,我打了nxt停止.. –

+0

而讀線;做 sed --in-place「/ $ line/d」/home/arno/pixtmp/pixtmp.csv done

0

sed不太適合比awk 。例如,假設您的輸入文件和你不想要的條款清單是空間分隔的,你可以簡單地做:

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

這將打印出來的文件「輸入」文件,省略其中的第一列相匹配的任何行行undesired

1

我會分兩步使用sed

  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命令不需要的記錄的,將它刪除逗號分隔的領域中間的內容數據線。如果你必須在開始或結束時處理不需要的字段,那麼你必須加倍努力。如果可能存在斜線,逗號,引號等,則還必須更加努力。第二次調用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 

隨着GNU sed,但不與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以從標準輸入讀取它的腳本。如果你有bash 4.x版本(Mac OS X上不規範),你可以使用進程替換來代替:

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 
+0

嗯..我想我會重寫劇本,把這些線..非常甜.. tnx .. –