我会分两步使用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的建议.. –