2017-07-19 30 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 
相关问题