【发布时间】:2014-02-11 10:46:32
【问题描述】:
我想优化我对具有这种结构的文件的处理:
2014-01-21 14:26:05.900,2014-01-21 14:26:05.740, 0.000, 192.168.40.2, 192.168.40.26,6 , 8000, 33311, 172000, 2000,.A..S., 0
2014-01-21 14:29:23.900,2014-01-21 14:29:23.340, 0.000, 192.168.40.26, 192.168.40.2,6 , 33317, 8000, 3052000, 2000,.A...., 0
2014-01-21 14:30:25.900,2014-01-21 14:30:25.330, 0.000, 192.168.40.26, 192.168.40.2,17 , 36193, 514, 558000, 2000,......, 0
2014-01-21 14:31:04.901,2014-01-21 14:31:04.222, 0.000, 192.168.40.242, 192.168.40.2,17 , 57516, 514, 422000, 2000,......, 0
2014-01-21 14:31:13.900,2014-01-21 14:31:13.143, 0.000, 192.168.40.16, 192.168.40.2,17 , 53313, 514, 540000, 2000,......, 0
到具有这种结构的文件:
2014-01-21 14:26:05.900,900,0.000,192.168.40.2,192.168.40.26,6,8000,33311,172000,2000,.A..S.,0
2014-01-21 14:29:23.900,900,0.000,192.168.40.26,192.168.40.2,6,33317,8000,3052000,2000,.A....,0
2014-01-21 14:30:25.900,900,0.000,192.168.40.26,192.168.40.2,17,36193,514,558000,2000,......,0
2014-01-21 14:31:04.901,901,0.000,192.168.40.242,192.168.40.2,17,57516,514,422000,2000,......,0
2014-01-21 14:31:13.900,900,0.000,192.168.40.16,192.168.40.2,17,53313,514,540000,2000,......,0
要优化的命令:
sed -e 's/,\s\+/,/g' -i /tmp/to_filter
sed -e 's/\s\+,/,/g' -i /tmp/to_filter
while IFS=, read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10; do
echo "$f1,${f1##*.},$f3,$f4,$f5,$f6,$f7,$f8,$f9,$f10"
done < /tmp/to_filter
【问题讨论】:
-
简单来说,您可以使用两个
-e选项将前两个sed操作组合到一个命令中。您还应该简单地将sed的输出传送到while循环,而不是重写文件。认为“临时文件是一个肮脏的黑客”。当然有时它们是必要的,并且在必要时毫不犹豫地使用它们。但是不要在不需要的时候使用它们。除此之外,你有并发使用问题(文件名是固定的,所以两个人同时运行脚本会相互干扰),你也有清理问题。