在unix中的两个字段中添加双引号

时间:2012-01-24 15:24:13

标签: linux unix sed awk

我有一个包含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

在所有其他情况下,它不应添加任何双引号

提前致谢

4 个答案:

答案 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'

这可以通过将替换限制为只有两个逗号,,不会一起出现的行来实现。在将进行替换的行中,我们使用数字标志在第一个逗号之后和第三个逗号之前添加双引号。