[英]optimize multiple sed statements
I want to optimize my processing of a file with this structure: 我想使用以下结构优化对文件的处理:
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
to a file with this structure: 到具有以下结构的文件:
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
Commands to optimize: 优化命令:
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
awk 'BEGIN{FS=OFS=","} {t=$2=$1; sub(/.*\./,"",$2); gsub(/ /,""); $1=t} 1' file
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
This might work for you (GNU sed): 这可能对您有用(GNU sed):
sed -r 's/^([^,.]*\.([^,]*)),[^,]*/\1,\2/;s/\s*,\s*/,/g' file
EDIT: 编辑:
sed -r 's/\.([^,]*),[^,]*/.\1,\1/;s/\s*,\s*/,/g' file
I would use a perl one-liner. 我会使用perl一线纸。 It maps over every field to remove leading and trailing spaces, then removes all characters from second fields until last
.
它映射到每个字段以删除前导和尾随空格,然后删除第二个字段中的所有字符,直到last
.
, and then print with all fields joined by a comma: ,然后使用逗号连接所有字段:
perl -F, -ane '
@F = map { s/\A\s+//; s/\s+\Z//; $_ } @F;
$F[1] =~ s/\A.*\.//;
printf qq|%s\n|, join q|,|, @F
' infile
It yields: 它产生:
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
使用awk
awk '{t=$1;gsub(/ /,"");split($1,a,".");$1=t;$2=a[2]}1' FS=, OFS=, file
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.