Заменить поле только для строк, начинающихся со строки, на определенную строку

Заменить поле только для строк, начинающихся со строки, на определенную строку

Вот файл, с которым мне нужно разобраться.

ENR1;203023;0000;H606626;001505;EL;00;1234;0000100;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201443;000000000;000000000;000000000;000000000;
ENR1;203357;0000;H606626;001653;EL;01;2546;0000800;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201503;000000000;000000000;000000000;000000000;
ENR6;001811;150316;000;00;201624;000000000;000000000;000000000;000000000;
ENR1;203385;0000;H606625;000615;EL;00;5861;0000100;00;00;201346100;H6022418;

Я должен заменить поле 7 каждой строки. Если значение равно 00, то я должен установить его в 01. Но только для строк, первое поле которых равноENR1!

awk -F';' -v OFS=';' 'NR>=1{sub("00","01",$7)}1' file > result

Это работает, но также замените поле $7 строками, начинающимися с ENR6.

Как добавить условие (только строки, начинающиеся с ENR1?)

решение1

я бы попробовал

awk -F';' -v OFS=';' '$7 == "00" && $1 == "ENR1" { $7 = "01" } {print} ' file > result

где

  • $7 == "00" && $1 == "ENR1" { $7 = "01" }применяется только к строке, начинающейся с ENR1, имеющей седьмое поле, равное00
  • $7 = "01"установите 7-е поле на 01
  • { print }вывести каждую строку, включая ENR1, после изменения.

  • вы можете захотеть сохранить NR>=1тест, если реальный файл имеет однострочный заголовок.

решение2

Короткийседподход:

sed -E 's/^(ENR1;([^;]+;){5})00;/\101;/' file

Выход:

ENR1;203023;0000;H606626;001505;EL;01;1234;0000100;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201443;000000000;000000000;000000000;000000000;
ENR1;203357;0000;H606626;001653;EL;01;2546;0000800;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201503;000000000;000000000;000000000;000000000;
ENR6;001811;150316;000;00;201624;000000000;000000000;000000000;000000000;
ENR1;203385;0000;H606625;000615;EL;01;5861;0000100;00;00;201346100;H6022418;

  • ^(ENR1;([^;]+;){5})00;- захватывает строки, начинающиеся с, ENR1за которыми следуют 5 полей ([^;]+;){5}и 7-е поле00;

Связанный контент