2017-04-17 34 views
1

我有以下輸入文件,我需要根據列放置過濾器。找到匹配時打印標題,否則不要打印標題。

cat test 
------------------------------------------------------------------------------------------ 
Client-code      ID  BONUS Availability   Offer  Credit 
------------------------------------------------------------------------------------------ 
BLAB-LO.AJBdLODikNcpok   SK-19 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJBluDikNcpok    SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJDaLAgNEp    SK-19 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJDaLDikNcpok    SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJDbLOAgNEp    SK-19 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJDbLODikNcpok   SK-19 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJHbmLO     SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJAcLOBollNcpok   SK-19 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJAcLOApkNamNk   SK-19 0  AVAILABLE    OFFERED  NA 
KONEAAO       SK-19 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJHbmLO     SK-11 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJAcLOBollNcpok   SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJAcLOApkNamNk   SK-10 0  AVAILABLE    OFFERED  NA 

在這裏,我把第二列過濾器,用平等,而不是正則表達式的基礎上,this

awk -v userInput='SK-1' 'NR<4 || $2 == userInput' test 
------------------------------------------------------------------------------------------ 
Client-code      ID  BONUS Availibility   Offer  Credit 
------------------------------------------------------------------------------------------ 
BLAB-LO.AJBluDikNcpok    SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJDaLDikNcpok    SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJHbmLO     SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJAcLOBollNcpok   SK-1 0  AVAILABLE    OFFERED  NA 

這個效果很好,如果有任何匹配,但是,如果沒有匹配,我會得到空頭。我想擺脫標題行。 (前三行)。

這是不期望的。

awk -v userInput='SK-122' 'NR<4 || $2 == userInput' test 
------------------------------------------------------------------------------------------ 
Client-code      ID  BONUS Availibility   Offer  Credit 
------------------------------------------------------------------------------------------ 

期望:

當沒有比賽,我需要得到:空白或沒有找到匹配的消息。

awk -v userInput='SK-122' 'NR<4 || $2 == userInput' test 

回答

1
$ awk -v userInput='SK-1' ' 
    NR<4 { hdr = hdr $0 ORS; next } 
    $2 == userInput { print hdr $0; hdr="" } 
    END { if (hdr!="") print "No match found" } 
' file 
------------------------------------------------------------------------------------------ 
Client-code      ID  BONUS Availability   Offer  Credit 
------------------------------------------------------------------------------------------ 
BLAB-LO.AJBluDikNcpok    SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJDaLDikNcpok    SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJHbmLO     SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJAcLOBollNcpok   SK-1 0  AVAILABLE    OFFERED  NA 
2

只需要存儲的頭和打印僅在第一userInput匹配:

awk -v userInput='SK-1' 'NR<4{header=sprintf("%s%s\n", header,$0);next}$2 == userInput{if (!i){printf("%s",header)};i=1;print}' test 

awk -v userInput='SK-1' 'NR<4{header=sprintf("%s%s\n", header,$0);next} 
       $2 == userInput{if (!i){printf("%s",header)};i=1;print} 
       END{if (!i){print "Not found"}}' test 
2

緩衝,打印,清潔:

$ awk -v i="SK-1" 'NR<4{b=b $0 "\n"} $2==i {b=b $0; print b; b=""}' file 
------------------------------------------------------------------------------------------ 
Client-code      ID  BONUS Availability   Offer  Credit 
------------------------------------------------------------------------------------------ 
BLAB-LO.AJBluDikNcpok    SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJDaLDikNcpok    SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJHbmLO     SK-1 0  AVAILABLE    OFFERED  NA 
BLAB-LO.AJAcLOBollNcpok   SK-1 0  AVAILABLE    OFFERED  NA