根据文件中的5个最后一个单词打印第一个单词

时间:2017-07-19 11:41:58

标签: bash shell awk

我有一个包含以下内容的文件,我只想打印第一个单词,如果它是以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个字段。

3 个答案:

答案 0 :(得分: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

如果需要整行,请在$1声明中删除print

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开头的行
  • 在从上面开始的行上,解析最后5个字段(使用NF循环并维护计数器,如果找到5个12个实例,则打印该行。

答案 1 :(得分: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
  • 开头

答案 2 :(得分: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

将很快添加非单一的衬垫形式和上述代码的说明。

EDIT1: 现在也成功添加非单线形式的解决方案。

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