Добавьте двойную кавычку в строку, если она не начинается с двойной кавычки - PullRequest
0 голосов
/ 04 июня 2018

У меня есть такой текстовый файл:

1,a,"some strings in a pair of double quotes"
2,b,"more strings in a pair of double quotes"
3,c,some messy strings with only right half double quotes"
4.d,"more strings in a pair of double quotes"

Я пытался использовать awk с sed, чтобы добавить недостающую левую двойную кавычку в 3-ю строку:

function addQuote(input) {
 return '"' + input
}    
BEGIN{
   FS=","
}

{
  if ($3~/^"/) s = $3
  else s = addQuote($3)

  print $1,$2,s
}

Кажетсячто функция addQuote не работает, но я не знаю, как это исправить.

Я знаю в sed Я могу легко добавить двойную кавычку к началу строки, выполнив sed 's/^/"/' line, но я не знаю, как заставить ее работать вместе с awk.Пожалуйста, помогите.Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Проблемы с вашей функцией addQuote ():

function addQuote(input) {
 return '"' + input
}

заключаются в том, что:

  1. ограничитель строки ", а не ', поэтому вам следует использовать"\"" вместо '"'.
  2. + является арифметическим оператором в awk, поэтому "\"" + input указывает awk на преобразование "\"" и содержимого input вцифры, а затем сложите их вместе.Вместо этого вам нужна конкатенация, и в awk для этого нет специального оператора - две строки рядом объединены , например, `` "\" "input`.

Поэтому, если бы вы написали свою функцию как:

function addQuote(input) {
 return ("\"" input)
}

, она бы делала то, что вы хотите. Я добавил паренсы для удобства чтения.

Сказав это, это может быть лучшим подходом, так какзакрывает пропущенные кавычки спереди и / или сзади и гарантирует, что КАЖДУЮ строку перекомпилируют, что важно, если вы когда-либо измените значение OFS: заимствуя входные данные из ответа @ RavinderSing13:

$ awk 'BEGIN{FS=OFS=","} {gsub(/^"|"$/,"",$3); $3="\"" $3 "\""} 1' file
1,a,"some strings in a pair of double quotes"
2,b,"more strings in a pair of double quotes"
3,c,"some messy strings with only right half double quotes"
4,d,"more strings in a pair of double quotes"
4,d,"more strings in a pair of double"
0 голосов
/ 04 июня 2018

После awk может вам помочь.

awk 'BEGIN{FS=OFS=","} $3 !~ /^"/{$3="\"" $3} 1'  Input_file

ИЛИ

awk 'BEGIN{FS=OFS=","} {$3=$3 !~ /^"/?"\"" $3:$3} 1'  Input_file

РЕДАКТИРОВАТЬ: Согласно комментариям сэра Джонатана в разделе комментариев, добавив следующий код, который будет обрабатывать 3 случая сейчас, он должен добавить ", если он не находится на 3-м поле полностью, он добавит, наконец, "поля или начала поля тоже.

Допустим, у нас есть следующий Input_file:

cat Input_file
1,a,"some strings in a pair of double quotes"
2,b,"more strings in a pair of double quotes"
3,c,some messy strings with only right half double quotes"
4,d,"more strings in a pair of double quotes
4,d,more strings in a pair of double

теперь следующий код может охватывать все 3 упомянутые перестановки / комбинации здесь:

awk 'BEGIN{FS=OFS=","} {$3=$3 !~ /\"/?"\"" $3 "\"":($3 !~ /^\"/?"\"" $3:($3 !~ /\"$/?$3 "\"":$3))} 1'  Input_file
1,a,"some strings in a pair of double quotes"
2,b,"more strings in a pair of double quotes"
3,c,"some messy strings with only right half double quotes"
4,d,"more strings in a pair of double quotes"
4,d,"more strings in a pair of double"
...