Unix - удалить внутреннюю двойную кавычку с запятой - PullRequest
0 голосов
/ 20 марта 2019

Входной файл:

"1","2col",""3col " "
"2","2col"," "3c,ol     " "
"3","2col"," 3co,l"     
"4","2col","3co,l"
"5","2col",""3co,l      ""              "
"6","2col",""3c,ol ""3c,ol"""

Выходной файл:

"1","2col","3col    "
"2","2col"," 3c,ol       "
"3","2col"," 3co,l"     
"4","2col","3co,l"
"5","2col","3co,l                       "
"6","2col","3c,ol 3c,ol"

Пожалуйста, помогите мне получить вышеуказанный вывод с помощью команды Unix. Обратите внимание, что 3-й столбец изменен в выводе, все внутренние двойные кавычки были удалены.

Запятая является терминатором. Если между двойной кавычкой присутствует запятая, она не считается терминатором. См. 6-ую строку и после 2-й запятой запятая присутствует в виде текста между двойной кавычкой, что нормально

Что я пробовал до сих пор:

sed 's/""|/|/g'
sed -e "s/\"\"//g"
perl -pe 's/(?<!^)(?<!\,)"(?!\,)(?!$)/""/g'

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Гипотеза (первый и второй столбцы являются "чистыми", они не содержат, например, ,)

Введите:

"1","2col",""3col " "
"2","2col"," "3c,ol     " "
"3","2col"," 3co,l"     
"4","2col","3co,l"
"5","2col",""3co,l      ""              "
"6","2col",""3c,ol ""3c,ol"""

Команда:

tr -d '"' < input | awk -F',' -v OFS=',' '{$1="\""$1"\"";$2="\""$2"\"";printf $1 OFS $2 OFS "\"";for(u=3;u<=NF;u++){if(u!=NF)printf $u OFS;else printf $u};printf "\"" RS}'

Выход:

"1","2col","3col  "
"2","2col"," 3c,ol      "
"3","2col"," 3co,l     "
"4","2col","3co,l"
"5","2col","3co,l                    "
"6","2col","3c,ol 3c,ol"

Пояснения:

  • tr -d '"' < input удалит все "
  • | awk труба на выходе до awk
  • -F',' -v OFS=',' разделитель полей ввода / вывода, определенный как запятая
  • вы окружаете первые 2 столбца " с помощью $1="\""$1"\"";$2="\""$2"\""; и печатаете их printf $1 OFS $2 OFS "\"";
  • for(u=3;u<=NF;u++){if(u!=NF)printf $u OFS;else printf $u};printf "\"" RS} для остальной части столбца вы просто складываете их вместе и добавляете последний " в конце строки.

Для удобства чтения:

'{
  $1="\""$1"\""
  $2="\""$2"\""
  printf $1 OFS $2 OFS "\""
  for(u=3;u<=NF;u++)
  {
    if(u!=NF)printf $u OFS
    else printf $u
  }
  printf "\"" RS
}'
0 голосов
/ 20 марта 2019

Используйте кавычки для нахождения первых двух полей и объединения других полей.

awk -F '"' '
   BEGIN {q="\""}
   {printf "%s", q$2q$3q$4q$5q; for (i=6;i<=NF;i++) printf "%s", $i; print q}
   ' inputfile

РЕДАКТИРОВАТЬ: альтернатива

paste -d, <( cut -d"," -f1,2 < inputfile) \
          <( cut -d"," -f3-  < inputfile | sed 's/"//g;s/.*/"&"/')

РЕДАКТИРОВАТЬ: Другая альтернатива

sed 's/old/new/g: применить замену ко всем совпадениям в регулярном выражении sed s / old / new / number`: заменить только номерное совпадение регулярного выражения. Когда вы смешиваете модификаторы g и number в GNU sed, первые совпадения игнорируются, а затем сопоставляются и заменяются все совпадения.
В этом случае:

sed -r 's/"//g6;s/$/"/' inputfile
...