Добавление двойных кавычек в два поля в Unix - PullRequest
0 голосов
/ 24 января 2012

У меня есть файл с 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 ]

3 голосов
/ 24 января 2012

Я бы, наверное, сделал что-то подобное, используя 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 и настроить ее в соответствии с вашими потребностями.

1 голос
/ 24 января 2012

Это может работать для вас:

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
0 голосов
/ 24 января 2012

Учитывая ограничения, вы можете использовать sed и указать поля для изменения:

sed '/,,/! s/,/,"/1; s/,/",/3'

Это работает, ограничивая подстановки только теми строками, в которых две запятые ,, не встречаются вместе.В строках, где будут производиться замены, мы используем числовые флаги для добавления двойной кавычки после первой запятой и перед третьей запятой.

0 голосов
/ 24 января 2012

Просто с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...