AWK - замена значения выбранного столбца разрушает формат вывода
У меня есть файл.csv в следующем формате.id|name|date
Я использую следующую команду Awk, чтобы изменить определенный столбец в строке, и это работает.awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
Я хочу сохранить вывод, однако формат уничтожен.
Что я хочу: 100|James|2015
Что я получаю: 100 James 2015
Как мне избежать второго и получить первый?
2 ответа
Вы можете установить OFS, разделитель полей вывода, как в этом примере:
awk -F\| -v OFS=\| '{print $1, $2, $3 }' test.psv
-v OFS=\|
назначаетOFS
переменные значения|
, Это альтернативаBEGIN { OFS = "|" }
блок.|
должен быть защищен от оболочки, поскольку значение уровня оболочки - это передача одной команды, выводимой на вход другой команды. С помощью"|"
или же\|
Есть два способа сделать это.
Никогда не позволяйте переменным оболочки расширяться, чтобы стать частью сценария awk:
awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
поскольку это открывает вас для коварных ошибок, учитывая различные значения этих переменных оболочки. Вместо этого заполните переменные awk из переменных оболочки и используйте переменные awk в скрипте:
awk -F "|" -v col="$col" -v val="$val" '{$col=val}1' filename.csv
Однако, по вашему конкретному вопросу, awk восстанавливает запись, когда вы присваиваете значение полю, поэтому вам нужно, чтобы OFS имел то же значение, что и FS:
awk -v col="$col" -v val="$val" 'BEGIN{FS=OFS="|"} {$col=val}1' filename.csv