Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 根据文件中的最后5个单词打印第一个单词_Bash_Shell_Awk - Fatal编程技术网

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

Bash 根据文件中的最后5个单词打印第一个单词,bash,shell,awk,Bash,Shell,Awk,我有一个包含以下内容的文件,仅当第一个单词以p开头且最后5个字符为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个字

我有一个包含以下内容的文件,仅当第一个单词以
p
开头且最后5个字符为
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个字段。

仅在第一个单词的
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~“^P”
    是一个正则表达式匹配项,用于过滤掉以
    P
  • 在从上面开始的行上,使用
    NF
    解析最后5个字段(循环),如果找到
    12
    的5个实例,则维护计数器并打印该行

    • 这是另一个带有
      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

      打印第一个字符或单词?对不起,Inian,我尝试了2个命令,但不能加入输出,我甚至不认为自己是脚本编写的初学者。因此,帮助。猫文件名AWK-F’[];'{打印子串(0美元,长度(0美元)-5,长度(0美元)})'CAT文件名> EGRIP-V 'P A'′AWK-F'[];' {打印$1 }。“最后5个字符等于12-这到底是什么意思?@James,已更新..如果最后5个字符是“12”,我将收到以下错误。致命:尝试访问字段-1@Sunny1985:我在您的示例输入文件上运行了它,它运行正常。您的输入文件与问题中的输入文件相同吗?不,不一样,它是一个非常大的文件,但格式相同。@sunny1985:那么你的逻辑是错误的,显然有一行以
      P
      开头,在你的大文件中少于5个字段。错误是试图访问少于5个字段的行。是的,我看到一些少于5个字段的条目。你能让它工作吗..回答得好
      ++
      ,叫我老式,但我会接受答案通过不断混乱的正则表达式循环;)是的,正则表达式需要大量的练习才能习惯,并且容易出错;)感谢分享美好的解决方案Sundeep。
      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
      
      $ 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