我會分兩步使用sed
:
- 從不需要的信息創建
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
命令不需要的記錄的,將它刪除逗號分隔的領域中間的內容數據線。如果你必須在開始或結束時處理不需要的字段,那麼你必須加倍努力。如果可能存在斜線,逗號,引號等,則還必須更加努力。第二次調用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
您可以顯示輸入文件和預期輸出的內容是什麼? – cmbuckley
聽起來像典型的awk工作。但沒有輸入/預期輸出,很難找到起點。 – Kent
@JonathanLeffler我搞清楚哪一個實際上是最好的......但tnx的建議.. –