Как заменить определенное поле в файле на основе содержимого другого поля?

У меня есть файл со следующим форматом:

A 485C72F95C72E15C EXTERNAL
B CC32480A3247F84A SYSTEM
C EC2A63F12A63B76C EXTERNAL

Я хочу отправить письмо в первом столбце, используя значение переменной «letter», и заменить значение во втором столбце со значением, которое я поставлю в переменной «id». Третья колонка может или не может отличаться или соответствовать в любом случае. Первый и второй столбцы никогда не будут содержать пробелов или специальных символов.

Я попытался использовать sed, но мой sed-fu не очень силен. Я придумал это:

letter=A
id=MYNEWIDSTRING
sed "/$letter /s/[^ ]*/$id/2"

Выход:

A MYNEWIDSTRING EXTERNAL
B MYNEWIDSTRING SYSTEM
C EC2A63F12A63B76C EXTERNAL

Идентификатор заменяется двумя строками, я предполагаю, что это связано с тем, что «A» совпадающий в конце исходной строки id.

Я знаю, что использовать sed -i для редактирования файла inplace, но не делать этого еще, поскольку моя команда все еще немного изворотладела.

Где я ошибался, или я должен использовать другой метод?

1
задан 3 November 2016 в 22:42

1 ответ

В любое время, когда вы имеете дело со структурированными данными, я бы использовал для awk или perl, а не sed.

Например

awk -v letter="A" -v id="MYNEWIDSTRING" '$1 == letter {$2=id}1' file
A MYNEWIDSTRING EXTERNAL
B CC32480A3247F84A SYSTEM
C EC2A63F12A63B76C EXTERNAL

или [ ! d3]

perl -alne '
  BEGIN{$letter = shift; $id = shift;} 
  print join " ", $F[0], $F[0] eq $letter ? $id : $F[1], @F[2..$#F]
' 'A' 'MYNEWIDSTRING' file

Новые версии GNU awk имеют флаг -i (--in-place); в других вам нужно будет использовать явный временный файл; perl должен иметь -i в любом случае.

5
ответ дан 23 May 2018 в 04:34
  • 1
    Приятно, я использовал awk для чтения данных из файла и не понял, что он также полезен для редактирования. – Arronical 3 November 2016 в 18:31
  • 2
    Я на 14.04, получается, что мой (g) awk - версия 4.0.1, и это было введено в версии 4.1.0. Полезно знать для дальнейшего использования. – Arronical 3 November 2016 в 18:43

Другие вопросы по тегам:

Похожие вопросы: