Я хочу найти и заменить значение внутри блока awk.
Вот пример входного файла для моего скрипта
P1
10,9:11/18013013582
,10:1
,167:0
,487:5/E.164
11,9:15/310410532169026
,10:60
,167:0
,487:4/IMSI
12,18:15/013329002130500
,19:0
15,9:10/9609610015
,10:1
,14:68
,167:0
,436:5/ABCDE
,487:5/E.164
16,87:1
17,9:10/8013765024
,10:1
,11:1
,12:0
,167:0
,487:5/E.164
23,9:11/13123149810
,10:1
,11:1
,167:0
,487:5/E.164
P3
42,3:1.
,4:3
,300:1.
43,3:1.
,4:3
,300:1.
44,3:0.
,4:7
,300:0.
45,5:0.3
А вот фрагмент кода, который я сейчас использую:
nawk -v fname="${filename}" -F '/|:' '
function isnum(x){return(x==x+0)}
/P1/,/P3/{
# Found start increment i reset variables go to next line
if(/P1/){
++i
fid =""
count++
next
}
# Found end validate variable and print go to next line
if(/P3/){
printf "%s|",count
printf "%s|",isnum(fid)?fid:"NULL"
next
}
if(!fid && /36,59:*/)
{
fid = $NF
}
' ${filename} >>output.txt
В принципе, мой входной файл будет содержать несколько блоков P1/P3, я беру один блок за раз и нахожу из него значение. Теперь, что я хочу в основном сделать, это изменить значение первого ,11:1(т.е. та, что после 17,9 части) на 11:2на основе значения 17,9:10/8013765024.
Обратите внимание, что до и после может быть несколько ,11, но они должны оставаться неизменными.
Пожалуйста, подскажите, как действовать дальше. Я совсем новичок и в awk, и в sed.
Также я пытался написать регулярное выражение, но не смог разобраться. Вот оно,
17[,0-9:\]*[\n]*,11
решение1
Попробуйте эту команду awk. Всякий раз, когда awk находит число, начинающееся с 80
column2, он берет следующую строку, а затем следующую строку и изменяет ее значение, чтобы ,11:2
вывести остальные строки как есть.
$ awk -F/ '$2~/^80/{print; getline; print; getline; $1=",11.2"}1' file1.txt
P1
10,9:11/18013013582
,10:1
,167:0
,487:5/E.164
11,9:15/310410532169026
,10:60
,167:0
,487:4/IMSI
12,18:15/013329002130500
,19:0
15,9:10/9609610015
,10:1
,14:68
,167:0
,436:5/ABCDE
,487:5/E.164
16,87:1
17,9:10/8013765024
,10:1
,11.2
,12:0
,167:0
,487:5/E.164
23,9:11/13123149810
,10:1
,11:1
,167:0
,487:5/E.164
P3
42,3:1.
,4:3
,300:1.
43,3:1.
,4:3
,300:1.
44,3:0.
,4:7
,300:0.
45,5:0.3
решение2
Вот awk
решение:
$ awk -F '/|:' '
$3 == "8013765024" {flag = 1}
$0 == ",11:1" && flag {$2 = 2;flag = 0}
1
' OFS=':' file
решение3
Вот возможное sed
решение:
sed '/17,9:10\/80/,/11:1/ {
s/8013765024/+118013765024/
s/11:1/11:2/ }' file.txt
Это запускает замену после того, как она находит 17,9:10/80
и сначала добавляет +11
к 8013765024
нему, делая его +118013765024
, а также заменяет 11:1
на 11:2
только для первого вхождения 11:1
(диапазон является включительным)
Запуск diff
выходных данных sed
и исходного файла показывает:
19c19
< 17,9:10/+118013765024
---
> 17,9:10/8013765024
21c21
< ,11:2
---
> ,11:1
это означает, что единственными изменениями в файле являются добавление [ +11
] и замена [ 11:1
] на [ 11:2
]. Дайте мне знать, если это правильно.