2017-07-19 51 views
3

我有一個文件,下面的內容,我想打印的第一個字,只有當它開始與P如果最後5個字符是12打印第一個字從文件

文件:

papa;1;2;3;4;5;12;12;12;12;12 
Peter;12;12;12;12;12 
alpha;2;2;2;4;5;6;7;8;9;3;3;3;3;3 
Prod;1;2;3;4;1;1;1;1;12;12;12;12;12 

預期輸出:

Peter 
Prod 

我嘗試:

cat filename | awk -F '[;]' '{print substr($0,length($0)-5,length($0))}' 
cat filename | egrep -V 'p|a' | awk -F '[;]' '{print $1}' 

但我無法加入輸出。


更新: -

在接受答案的評論,顯然是OP說,有可能低於最終文件還5場線。

+0

_print第一個字符或單詞? –

+0

對不起,這是word .. – Sunny1985

+0

Inian,我試過2條命令,但無法加入輸出,我甚至不認爲自己是腳本編程的初學者。因此,幫助。cat文件名| awk -F'[;]''{print substr($ 0,length($ 0)-5,length($ 0))}'' cat filename | egrep -V'p | a'| awk -F'[;]''{print $ 1}' – Sunny1985

回答

4

Awk做單獨的第一個字

awk -F';' '$1 ~ /^P/ && NF > 5 {c=0; for(i=NF-4;i<=NF;i++) {if($i==12){c++}} if(c==5) print $1} ' file 
Peter 
Prod 

,如果整條生產線需要刪除$1print聲明

awk -F';' '$1 ~ /^P/ && NF > 5 {c=0; for(i=NF-4;i<=NF;i++) {if($i==12){c++}} if(c==5) print} ' file 
Peter;12;12;12;12;12 
Prod;1;2;3;4;1;1;1;1;12;12;12;12;12 

它是如何工作的粗暴的方式?

  • 的部分$1 ~ "^P"是一個正則表達式匹配來濾除開始的行P
  • 在開始的行以上,解析使用NF最後5個字段(循環和通過保持計數器,並且如果5個實例打印線的12被發現。
+0

我收到下面的錯誤。致命的:嘗試訪問字段-1 – Sunny1985

+0

@ Sunny1985:我在你的示例輸入文件上運行它,它工作。你的輸入文件是否與問題 – Inian

+0

相同?不,它是不一樣的,它是生活中非常大的文件,但格式相同。 – Sunny1985

4

這裏是另外一個與awk

$ cat ip.txt 
papa;1;2;3;4;5;12;12;12;12;12 
Peter;12;12;12;12;12 
alpha;2;2;2;4;5;6;7;8;9;3;3;3;3;3 
Prod;1;2;3;4;1;1;1;1;12;12;12;12;12 
Post;1;3;12;12;12 

$ awk -F';' '/^P.*(;12){5}$/{print $1}' ip.txt 
Peter 
Prod 
  • /^P.*(;12){5}$/開頭的行P遞歸檢查;12;12;12;12;12
+1

不錯的答案'++',叫我老式的,但我會採取一個循環回答不斷混淆正則表達式的方式;) – Inian

+2

是的,正則表達式需要很多習慣習慣和容易犯錯誤;) – Sundeep

+0

感謝您分享Nice解決方案Sundeep。 – RavinderSingh13

0

多了一個辦法,用變量的一切結束。讓我知道這是否有助於你。

awk -F";" -v num=12 -v count=5 -v cha="P" 'function check(count){if($(NF-(--count))==num && count){check(count)};if(!count && substr($0,1,1)==cha){print $1}} check(count)' Input_file 

不久將添加非單線形式和上述代碼的解釋。

編輯1:現在也成功地添加了非線性形式的解決方案。

awk -F";" -v num=12 -v count=5 -v cha="P" ' 
      function check(count){ 
      if($(NF-(--count))==num && count){ 
       check(count) 
              }; 
      if(!count && substr($0,1,1)==cha){ 
      print $1 
              } 
           } 
     check(count) 
              ' Input_file 
相關問題