我有一个包含3列的文件,第2列是纬度/经度,可能有也可能没有数据。
2012-01-10 21:27:52.811,,ABC -- No lat/long
2012-01-10 21:27:52.811,37.8889329,-112.1876328,XYZ -- with lat long
有人可以帮我用sed / awk / perl将其转换为
2012-01-10 21:27:52.811,"37.8889329,-112.1876328",XYZ
在所有其他情况下,它不应添加任何双引号
提前致谢
答案 0 :(得分:3)
我可能会这样做,使用awk
:
% echo '2012-01-10 21:27:52.811,,ABC -- No lat/long
2012-01-10 21:27:52.811,37.8889329,-112.1876328,XYZ -- with lat long
' | awk -F',' -v OFS=',' '
$2 && $3 {
$2 = "\"" $2
$3 = $3 "\""
}
1
'
2012-01-10 21:27:52.811,,ABC -- No lat/long
2012-01-10 21:27:52.811,"37.8889329,-112.1876328",XYZ -- with lat long
这假定字段在进入和离开的路上以逗号分隔。
如果填充了第二个和第三个字段,则
"
"
打印所有行(1
)。
这里有很多假设,所以你必须挖出sed & awk book并调整它以满足你的需求。
答案 1 :(得分:1)
这可能对您有用:
sed '/^[^,]*,,/!s/,\([^,]*,[^,]*\)/,"\1"/' file
2012-01-10 21:27:52.811,,ABC -- No lat/long
2012-01-10 21:27:52.811,"37.8889329,-112.1876328",XYZ -- with lat long
答案 2 :(得分:0)
只是使用bash:
oldIFS=$IFS
IFS=,
while read a b c d; do
if [[ -z "$d" ]]; then
printf "%s,,%s\n" "$a" "$c"
else
printf "%s,\"%s,%s\",%s\n" "$a" "$b" "$c" "$d"
fi
done < filename > filename.new
IFS=$oldIFS
答案 3 :(得分:0)
考虑到约束,您可以使用sed并指定要更改的字段:
sed '/,,/! s/,/,"/1; s/,/",/3'
这可以通过将替换限制为只有两个逗号,,
不会一起出现的行来实现。在将进行替换的行中,我们使用数字标志在第一个逗号之后和第三个逗号之前添加双引号。