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
Другие вопросы по тегам