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 ブロックが含まれており、一度に 1 つのブロックを取得してそこから値を見つけます。ここで基本的にやりたいことは、最初の 11 の値を変更することです。1(つまり、17,9 の部分の後) を 11 に:217,9:10/の値に基づく8013765024。
前後に複数の ,11 が存在する可能性がありますが、それらは変更されないことに注意してください。
今後どのように進めればよいか教えてください。私は awk と sed の両方について非常に初心者です。
また、正規表現を書いてみましたが、うまく理解できませんでした。これが正規表現です。
17[,0-9:\]*[\n]*,11
答え1
この awk コマンドを試してください。awk は、列 2 で始まる数字を見つけるたびに80
、次の行を取得し、さらに次の行を取得してその値を変更し、,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