【问题标题】:Any way to find if two adjacent new lines start with certain words?有什么办法可以找到两个相邻的新行是否以某些单词开头?
【发布时间】:2013-05-27 05:44:31
【问题描述】:

假设我有一个这样的文件:

+jaklfjdskalfjkdsaj
fkldsjafkljdkaljfsd
-jslakflkdsalfkdls;
+sdjafkdjsakfjdskal

我只想查找并计算此文件中以- 开头的行紧跟以+ 开头的行的次数。

规则:

  • 没有外部脚本
  • 必须在 bash 脚本中完成
  • 必须内联

例如,我可以弄清楚如何在 Python 脚本中做到这一点,但我从来没有在 Bash 中做过如此广泛的事情。

谁能帮帮我?我认为它最终会成为grepperl,或者可能是一个有才华的sed 行——但这些都是我仍在学习的东西。

谢谢大家!

【问题讨论】:

  • 删除了 Python 标记,因为您似乎不想使用它来获得答案。
  • 谢谢!有人告诉我我可以使用python,只要它是内联的,所以我想无论如何我都会包含它。感谢您纠正错误!
  • Python 不适合命令行中的一个衬垫......所以不是一个可行的答案
  • 虽然对一个班轮来说不是很好,但它可能,并且能够工作,因此是一个可行的答案。感谢您的编辑! perlawkgrep 都更适合这份工作,所以在某种程度上你是对的!

标签: perl bash sed grep


【解决方案1】:

在 Perl 中很容易:

perl -lne '$c++ if $p and /^\+/; $p = /^-/ }{ print $c' FILE

【讨论】:

【解决方案2】:

awk 单行:

awk -v FS='' '{x=x sprintf("%s", $1)}END{print gsub(/-\+/,"",x)}' file

例如

kent$  cat file
+jaklfjdskalfjkdsaj
fkldsjafkljdkaljfsd
-jslakflkdsalfkdls;
+sdjafkdjsakfjdskal
-
-
-
+
-
+
foo
+

kent$  awk -v FS='' '{x=x sprintf("%s", $1)}END{print gsub(/-\+/,"",x)}' file
3

【讨论】:

    【解决方案3】:

    grep -A1 "^-" $file | grep "^+" | wc -l

    第一个 grep 查找所有以 - 开头的行,-A1 导致它也输出匹配后的行。

    然后,我们对任何以+ 开头的行进行 grep 输出。逻辑上:

    1. 我们知道第一个 grep 的输出只有 -XXX 行和以下行
    2. 我们知道+xxx 行不能同时是-xxx

    因此,任何+xxx 行都必须在后面的行中,并且应该被计算在内,我们用wc -l 来做

    【讨论】:

      【解决方案4】:

      另一个 Perl 示例。不像 choroba 那样简洁,但它的工作方式更加透明:

      perl -e'while (<>) { $last = $cur; $cur = $_; print $last, $cur if substr($last, 0, 1) eq "-" && substr($cur, 0, 1) eq "+" }' < infile
      

      输出:

      -jslakflkdsalfkdls;
      +sdjafkdjsakfjdskal
      

      【讨论】:

        【解决方案5】:

        纯 bash:

        unset c p
        while read line ; do
            [[ $line == +* && $p == 0 ]] && (( c++ ))
            [[ $line == -* ]]
            p=$?
        done < FILE
        echo $c
        

        【讨论】:

          猜你喜欢
          • 2019-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-07
          • 2020-11-10
          • 1970-01-01
          • 2019-11-02
          • 2015-03-02
          相关资源
          最近更新 更多