2013-05-31 1 views
5

は、私はそうのようなファイルがあるとしましょう:2つの隣接する新しい行が特定の単語で始まるかどうかを調べる方法はありますか?

+jaklfjdskalfjkdsaj 
fkldsjafkljdkaljfsd 
-jslakflkdsalfkdls; 
+sdjafkdjsakfjdskal 

私だけ-で始まる行がすぐに+で始まる行が続いているこのファイルの間に倍の量を見つけてカウントします。

ルール:

  • はbashスクリプト内から実行する必要があります

    • 外部スクリプトが
    • でなければなりませんインライン
    私はPythonスクリプトでこれを行う方法を見つけ出すことができ

    たとえば、私はBashでこれほど広範なことを行う必要はありませんでした。

    誰でもお手伝いできますか?私はそれがgrepperl、または多分才能のあるsedのラインになるだろうと思っていますが、これは私がまだ学んでいるものです。

    ありがとうございました! Perlで

  • +2

    それを使って答えが欲しい。 –

    +0

    ありがとう!インラインである限り、Pythonを使うことができると言われたので、とにかくそれを含めることにしました。間違いを訂正してくれてありがとう! –

    +0

    Pythonはコマンドライン上の1つのライナーにはあまり適していません...実行可能な回答ではありません –

    答えて

    6

    簡単:

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

    これは完璧です!あなたがPerlの正規表現を学んだのをどのように始めたのか聞いてもらえますか?私はそれの周りに私の心を包み始めているように見えることはできません。 –

    +0

    '} {'は 'END {}'と似ています。この構文の参照はありますか? –

    +1

    @mpapec:これは「エスキモー挨拶オペレータ」と呼ばれています。 http://www.catonmat.net/blog/secret-perl-operators/#eskimoを参照してください。 – choroba

    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 
    
    8

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

    最初のgrepは-で始まる行の全てを見つけ、-A1が生じ、それにあまりにもマッチ後の出力ライン。

    次に、+で始まる行の出力をgrepします。論理的に:

    1. 私たちは、最初のgrepの出力のみ-XXX行と次の行である知っている
    2. 我々は+xxxラインはまた、任意の+xxx-xxxラインしたがって

    することができないことを知っています行は次の行でなければならず、数えます。wc -l

    1

    もう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 
    
    1

    ピュアbashの:あなたがに表示されないようPythonのタグを削除し

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