5

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

+jaklfjdskalfjkdsaj
fkldsjafkljdkaljfsd
-jslakflkdsalfkdls;
+sdjafkdjsakfjdskal

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

规则:

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

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

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

谢谢你们!

4

5 回答 5

9

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

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

然后,我们为任何以+. 逻辑上:

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

因此,任何+xxx行都必须跟随行,并且应该被计算在内,我们用wc -l

于 2013-05-31T12:03:07.683 回答
6

在 Perl 中很容易:

perl -lne '$c++ if $p and /^\+/; $p = /^-/ }{ print $c' FILE
于 2013-05-31T12:00:14.973 回答
1

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
于 2013-05-31T12:01:57.747 回答
1

另一个 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
于 2013-05-31T12:08:00.960 回答
1

纯重击:

unset c p
while read line ; do
    [[ $line == +* && $p == 0 ]] && (( c++ ))
    [[ $line == -* ]]
    p=$?
done < FILE
echo $c
于 2013-05-31T12:14:03.973 回答