Linux

如何在從文件 1 到文件 2 的關鍵字第 n 次出現後添加一行

  • March 19, 2018
# Nexae Linux servers
##
subparent Nexas Nexae_NIX Linux
title Nexae Linux servers

group-eorted NFe zluetere
10.48.37.67 zintxzpanae01       # teetip NOzOLUMNe:info,trende
10.59.31.67 etrtxzpanae01       # teetip NOzOLUMNe:info,trende

group-sorted ZBTS

10.48.37.11 zinpl001z3a01       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.12 zinpl001z3a02       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.13 zinpl001z3a03       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.14 zinpl001z3a04       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.41 zinpl001z3b01       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.42 zinpl001z3b02       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.31 zinvl201a3001       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.32 zinvl201a3002       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.33 zinvl201a3003       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.150 zinvl201a3004      #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.151 zinvl201a3005      #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.152    zinvl201a3006   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.20 zinvl201a3007       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.39 zinvl201a3008       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.65 zinvl201a3009       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.66 zinvl201a3010       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.70 zinvl201a3011       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.158    zinvl201a3012   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.34     zinvl201a3013   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"

group-sorted NTTA

10.59.31.11 etrpl001z1a01       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.12 etrpl001z1a02       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.13 etrpl001z1a03       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.14 etrpl001z1a04       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.31 etrvl201a1001       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.32 etrvl201a1002       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.33 etrvl201a1003       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.150    etrvl201a1004   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.151    etrvl201a1005   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.152    etrvl201a1006   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.44 etrvl201a1008       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.47 etrvl201a1009       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.39 etrvl201a1010       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.65 etrvl201a1011       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.66 etrvl201a1012       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.70 etrvl201a1013       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
170.252.208.216 etrvl201a1007   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"

#######################################################
##

以上是HO文件的例子。我正在使用下面sed的程式碼來匹配文件中的關鍵字group-sorted NTTAho然後將文件中的所有條目插入t4ho.

sed -i.bak '/^group-sorted NTTA$/!b;N;N;r t4' ho

但是關鍵字group-sorted NTTA在文件中出現了 15 次,所以如果我想在中間關鍵字之後插入條目。我可以這樣做sed嗎?

要在文件 H0 中的n-th 出現後兩行插入文件 t4 的內容,請嘗試:^group-sorted NTTA$

awk -v n=2 'FNR==NR{t=t"\n"$0;next} /^group-sorted NTTA$/ && n==++cnt {x=NR+3} NR==x{print substr(t,2)} 1' t4 H0

雖然毫無疑問有一個sed解決這個問題的方法,但awk這裡是一個更自然的選擇,因為awk了解算術。例如,這使得程式在第-次出現 where is a variableawk之後執行某些操作變得更容易。n``n

這個怎麼運作

  • -v n=2

這設置了 的值n

  • FNR==NR{t=t"\n"$0;next}

當讀取第一個命名的文件時t4,這會將其內容保存在變數中t

  • /^group-sorted NTTA$/ && n==++cnt {x=NR+3}

在讀取第二個文件時H0, 的出現次數^group-sorted NTTA$保存在變數 中cnt。如果cnt等於n,那麼我們將變數分配給x目前行號的值,NR,加上 3。

  • NR==x{print substr(t,2)}

當我們到達行號x時,我們列印變數的內容t。(該substr命令刪除了多餘的前導換行符。)

  • 1

這是 awk 對 print-the-current-line 的簡寫。

例子

考慮這些輸入文件:

$ cat H0
blah, blah
group-sorted ZBTS

10.48.37.11 zinpl001z3a01 #"TRENDe
10.48.37.12 zinpl001z3a02 #"TRENDe

group-sorted NTTA

10.59.31.11 etrpl001z1a01       # "TRENDe
10.59.31.12 etrpl001z1a02       # "TRENDe
10.59.31.13 etrpl001z1a03       # "TRENDe

group-sorted NTTA

10.59.31.14 etrpl001z1a04       # "TRENDe
10.59.31.31 etrvl201a1001       # "TRENDe
10.59.31.32 etrvl201a1002       # "TRENDe

group-sorted NTTA

10.59.31.33 etrvl201a1003       # "TRENDe
10.59.31.150    etrvl201a1004       # "TRENDe
10.59.31.151    etrvl201a1005       # "TRENDe

和:

$ cat t4
line 1 of t4
line 2 of t4

我們命令的輸出是:

$ awk -v n=2 'FNR==NR{t=t"\n"$0;next} /^group-sorted NTTA$/ && n==++cnt {x=NR+3} NR==x{print substr(t,2)} 1' t4 H0
blah, blah
group-sorted ZBTS

10.48.37.11 zinpl001z3a01 #"TRENDe
10.48.37.12 zinpl001z3a02 #"TRENDe

group-sorted NTTA

10.59.31.11 etrpl001z1a01       # "TRENDe
10.59.31.12 etrpl001z1a02       # "TRENDe
10.59.31.13 etrpl001z1a03       # "TRENDe

group-sorted NTTA

10.59.31.14 etrpl001z1a04       # "TRENDe
line 1 of t4
line 2 of t4
10.59.31.31 etrvl201a1001       # "TRENDe
10.59.31.32 etrvl201a1002       # "TRENDe

group-sorted NTTA

10.59.31.33 etrvl201a1003       # "TRENDe
10.59.31.150    etrvl201a1004       # "TRENDe
10.59.31.151    etrvl201a1005       # "TRENDe

引用自:https://unix.stackexchange.com/questions/415518