
Вот файл, с которым мне нужно разобраться.
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;