2017-07-13 58 views
0

Awk程序應處理許多數據文件。在每個數據文件中,它應該尋找模式並在新字段中插入兩行/記錄。 (這只是一個例子,最終的程序必須在這個動作旁邊做更多的事情)。awk在匹配的標記打印中插入行/記錄

數據文件(S)爲例

Rec not needed-1 
Rec not needed-2 
Rec not needed-n 
start 
Record-1 
Record-2 
Record-n 

這是製表符分隔,在這裏我們只有$ 1。

源程序

BEGIN { OFS=FS="\t"} 

FNR==1 {flag=0;} p; 
#flag && $1!=""{$1=$1; print} 

$1=="Record-2" && flag{$1="";$2="newline1"; print; $1=""; $2="newline2"; print} 
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="newline2"; print; flag=0} 1 

flag!=0{print}; 
/start/{flag=1} 

由於我使用的是Windows,這是通過GAWK調用。

想輸出:

Record-1 
     newline1 
     newline2 
Record-n 

我與 「NEWLINE2」

Record-1 
     newline1 
     newline2 
     newline2 
Record-n 

我認爲是關係到使用的 「旗幟」 問​​題的dublication的問題輸出。但爲了執行我的awk程序在工作中的所有其他動作,應該保持不變 - 只要它不會'傷害'。謝謝。

+0

能否請您在此處添加更加清晰的樣品INPUT_FILE和預期的輸出文件? – RavinderSingh13

回答

0

正如你說的,因爲flag的,最後

flag!=0{print}; 

做一個額外的打印,所以你可以在$1=="Record-2" ...刪除最後一個打印:

BEGIN { OFS=FS="\t"} 

FNR==1 {flag=0} 
#flag && $1!=""{$1=$1; print} 

$1=="Record-2" && flag{$1="";$2="newline1"; print; $2="newline2"} 
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="newline2"; print; flag=0} 1 

flag!=0{print} 
/start/{flag=1} 

另一種選擇可能是將另一個條件添加到flag,但不知道這是否會混淆您的腳本:

BEGIN { OFS=FS="\t"} 

FNR==1 {flag=0} 
#flag && $1!=""{$1=$1; print} 

$1!="Record-2" && flag!=0 {print} 

$1=="Record-2" && flag{$1="";$2="newline1"; print; $2="newline2"; print} 
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="newline2"; print; flag=0} 1 

/start/{flag=1} 

或者:

BEGIN { OFS=FS="\t"} 

FNR==1 {flag=0} 
#flag && $1!=""{$1=$1; print} 

$1=="Record-2" && flag{$2="newline1"; print "\t"$2; $2="newline2"; print "\t"$2} 
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="newline2"; print; flag=0} 1 

$1!="Record-2" && flag!=0{print} 
/start/{flag=1} 
+1

我工作。我現在選擇第一個解決方案,在那裏我省略了打印。總之,我會仔細看看其他解決方案。萬分感謝。 – colt