Разбить заголовок в файле и на основе заголовка заменить значение в файле

У меня проблема, с которой мне нужна помощь. Я не очень разбираюсь в awk, но, похоже, это хороший инструмент для этой работы. У меня есть следующий файл

Field1|Field2|Field3|Field4|Field5 a|b|c|d|e 1|2|3|4|5 z|y|x|w|v 

У меня есть сценарий, который принимает два входа

 script.sh Field3 T 

Script.sh будет принимать аргумент «Field3» и на основе этого номера столбца должен заменить содержимое «T». Я огляделся по интернету и перешел на stackexchange и нашел кучу вещей, подобных этому, но не совсем так. Любая помощь будет оценена по достоинству.

[редактировать]

Я попробовал следующее предложение от @Costas и столкнулся с проблемой. Мой файл выглядит так:

 MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE 8.2~Y~N~~0 

Если я запустил следующий скрипт

 cat <filename> | awk -F'~' -vp='MODULE_ColumnD' -vr='99' 'NR==1{for (i=1;i<=NF;i++) if($i==p)f=i;print;next}$f=r' 

Он заменяет значение, но разделитель отсутствует или заменяется пространством на выходе как таковым:

 MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE 8.2 YN 99 0 

Как мне вернуть разделитель в записи?

  • `tail -f` частично потребляет последнюю строку, не заботится о новых или nul
  • Как запросить ввод от пользователя из переменной или массива bash?
  • Ошибка сценария bash: источник: не найден
  • globbing и $ #
  • Переместить файлы обратно по 2 директориям
  • Спросить имя хоста в сценарии оболочки?
  • Запустите скрипт, прежде чем что-либо появится на экране после входа в систему
  • Почему `du -sh *` жалуется на недопустимые параметры?
  • One Solution collect form web for “Разбить заголовок в файле и на основе заголовка заменить значение в файле”

     awk -F'|' -vp='Field3' -vr='T' ' NR==1{ for (i=1;i<=NF;i++) if ($i==p) f=i print next} $f=r ' 

    Если вам нравится форматировать его, чтобы использовать его как script.awk сохраните его как:

     #!/usr/bin/awk -f BEGIN{ OFS=FS="|"} NR==1{ for (i=1;i<=NF;i++) if ($i==p) f=i print next} $f=r 

    и выполнить его исполняемый файл с помощью chmod +x script.awk и использовать:

     ./script.awk p=Field4 r=T input.file 
    Linux и Unix - лучшая ОС в мире.