说我有这样的文件:
+jaklfjdskalfjkdsaj
fkldsjafkljdkaljfsd
-jslakflkdsalfkdls;
+sdjafkdjsakfjdskal
我只想查找并计算此文件中以-
开头的行后面紧跟着以+
开头的行的次数。
规则:
例如,我可以弄清楚如何在Python脚本中执行此操作,但我从未在Bash中做过这么广泛的事情。
有人可以帮帮我吗?我认为它最终会成为grep
,perl
,或者可能是一个才华横溢的sed
行 - 但这些是我还在学习的东西。
谢谢大家!
答案 0 :(得分:8)
grep -A1 "^-" $file | grep "^+" | wc -l
第一个grep查找以-
开头的所有行,而-A1
也会导致它也在匹配后输出该行。
然后,我们为以+
开头的任何行grep输出。逻辑值:
-XXX
行和以下行+xxx
行不能也是-xxx
行因此,任何+xxx
行必须跟随行,并且应该计算,我们使用wc -l
答案 1 :(得分:6)
Perl很容易:
perl -lne '$c++ if $p and /^\+/; $p = /^-/ }{ print $c' FILE
答案 2 :(得分:1)
awk 单行:
awk -v FS='' '{x=x sprintf("%s", $1)}END{print gsub(/-\+/,"",x)}' file
e.g。
kent$ cat file
+jaklfjdskalfjkdsaj
fkldsjafkljdkaljfsd
-jslakflkdsalfkdls;
+sdjafkdjsakfjdskal
-
-
-
+
-
+
foo
+
kent$ awk -v FS='' '{x=x sprintf("%s", $1)}END{print gsub(/-\+/,"",x)}' file
3
答案 3 :(得分: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
答案 4 :(得分:1)
Pure bash:
unset c p
while read line ; do
[[ $line == +* && $p == 0 ]] && (( c++ ))
[[ $line == -* ]]
p=$?
done < FILE
echo $c