awk неожиданно удаляет точку из строки

9

Я хочу добавить столбец (2-е место) в .csvфайл и хочу, чтобы значения этого столбца были строками и заключались в кавычки;

Следующая команда добавляет столбец, но без кавычек:

awk -F"," 'BEGIN { OFS = "," } {$2="2.4.0"; print}' test.csv > output.csv

Следующий подход включает в себя кавычки, но по какой-то причине он удаляет последнюю .(точку) из значения

awk -F"," 'BEGIN { OFS = "," } {$2="\""2.4.0"\""; print}' test.csv > output.csv

так что мои значения в конечном итоге "2,40".

Как я должен идти об этом?

pkaramol
источник
Если в вашем файле 2 или более столбцов, вы хотите вставить или заменить второй столбец?
ctac_
просто вставьте столбец после первого
pkaramol
2
хорошо, чтобы вставить, вы должны использовать: awk 'BEGIN {FS = OFS = ","} {$ 1 = $ 1 ", \" 2.4.0 \ ""} 1'
ctac_
1
или awk '{sub (",", ", \" 2.4.0 \ ",")} 1'
ctac_

Ответы:

12

Вы, кажется, ошиблись в кавычках. Вам нужно сделать как ниже

awk -F"," 'BEGIN { OFS = "," } {$2="\"2.4.0\""; print}' test.csv > output.csv

Это объясняется на man-странице GNU awk - 3.2 Escape-последовательности

Некоторые символы не могут быть включены буквально в строковые константы ("foo")или константы регулярного выражения ( /foo/). Вместо этого они должны быть представлены escape-последовательностями, которые являются символьными последовательностями, начинающимися с обратной косой черты ( \). Одним из вариантов использования escape-последовательности является включение символа двойной кавычки в строковую константу. Поскольку простая двойная кавычка оканчивает строку, вы должны использовать ее \"для представления действительного символа двойной кавычки как части строки.


Что касается причины, по которой я мог понять причину такого поведения, то, awkпохоже, интерпретировал его 2.4.0как числовое слово с дополнительными кавычками из вашего ОП и решает потерять точность после первой точки.

т.е.

$2="\""2.4.0"\""

становится просто

$2=""2.4.0""

который awkбольше не понимает как строка. Вы можете воспроизвести это поведение, просто выполнив

awk 'BEGIN { print ""2.4.0"" }'
2.40

который оказывается результатом, когда вы делаете

awk 'BEGIN { print 2.4.0 + 0 }'
Inian
источник
1
@roaima: Судя по тому, что я знаю, это, кажется, только что отменилось и привело к { print 2.4.0 }или { print 2.4.0 + 0 }, то есть как нестроковая составляющая. Я тоже пытался найти соответствующие документы, но не смог
Иниан
2
Другой способ удобного добавления кавычек, которые я иногда использую, состоит в том, чтобы определить переменную, например:awk -v q='"' '... print q "2.4.0" q ...
Тор