【问题标题】:Optimize a multi-utility command to a single-utility command将多实用程序命令优化为单实用程序命令
【发布时间】:2017-04-29 15:26:25
【问题描述】:

我有一个大文件,其中的部分由### 标记分隔。输出有一个空行,一些随机行,另一个空行,然后是我要计算字数的行,然后是另一个空行。我可以获得我想要的数据,但我同时使用了几个管道,我认为使用 awk 或 sed 一个衬垫可以做得更好。你能帮忙吗?

文件示例

...  
sdf  
asdf  
asdf  
asdf  


###################### Usage ###########

a  
asdf    

asdf    
asdf    
70  
80  
90  
100  

################



sfad

asdf  
asff  
...  

我的有效命令是:

awk '/Usage/{flag=1; next}/####/{flag=0} flag' *|
  sed  -n '0,/^$/! p'|
    awk '/^$/{flag=1; next}/^$/{flag=0} flag'|
      wc -l

第一个awk 会在我要使用的文件中提取该部分数据。 sed 跳过第一个空行。 第二个awk 拉取第二个空行到第三个空行之间的数据。 然后我得到我的字数。

【问题讨论】:

  • @EdMorton:我相信预期的答案是6

标签: optimization awk sed


【解决方案1】:

尝试以下方法(如果需要,您可以将其变成单线):

awk '
   FNR==1 { blankCount = inSection = count = 0 } # initialize vars. for every file
   /^#+ Usage #/ { inSection=1; next }           # section start, set flag
   inSection && /^#+/ { print count; nextfile }  # section end, print result, proceed to next file
   inSection {                            # a line inside the section of interest
     if (NF == 0)  { ++blankCount; next } # a blank line, count it and skip
     if (blankCount == 2) { count+=NF }   # a line after the 2nd blank one, count its words
   }
' file                                    # supports multiple input files

注意:

  • 代码假定每个部分至少有 3 个空白行,并且第 2 个空白行和第 3 个空白行或部分末尾(以先到者为准)之间的单词/非空行应该被计算在内。
    使用示例输入,结果为6

  • 代码计数 字数(空格分隔的字段,反映在 NF 中,字段数)而不是行数,但由于您的输入每行只有一个字,因此行数(这是您的 wc -l 命令所做的)与字数相同。

【讨论】:

    【解决方案2】:
    $ cat tst.awk
    /Usage/ { inBlock=1 }
    inBlock {
        if (NF) {
            if (numEmptyLines == 2) {
                numWords += NF
            }
        }
        else {
            if (++numEmptyLines == 3) {
               print numWords+0
               inBlock = numEmptyLines = numWords = 0
            }
        }
    }
    
    $ awk -f tst.awk file
    6
    

    【讨论】:

    • 这行得通,但我忘了提到有时数据会丢失,所以它将是空行、数据、空行,然后是###。运行此将返回计数 1,因为它将调用以下 ### 并在之后的空白行结束。谢谢埃德。
    猜你喜欢
    • 1970-01-01
    • 2013-09-02
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多