3

「x_y=XXXX」を含む行が多数あるファイルがあります。ここで、XXXX は 0 から N までの数値です。

さて、a) そのようなすべての行で、行の XXXX 部分だけを取得したいと思います。b) 平均を出したい

おそらく、これらの両方が 1 つのライナーに含まれています。

私は何かを試しています

cat filename.txt | grep x_y | (this need to be filled)

何をファイルすればよいかわからない 過去に次のようなコマンドを使用しました

perl -pi -e 's/x_y/m_n/g' 

x_y のすべてのインスタンスを置き換えます。しかし今、私は x_y=XXXX を照合して XXXX を取得し、ファイル全体で平均化したいと考えています。

これに関するヘルプは大歓迎です。私はperlと正規表現にかなり慣れていません。

4

4 に答える 4

6

Timtowtdi (いつものように)。

perl -nE '$s+=$1, ++$n if /x_y=(\d+)/; END { say "avg:", $s/$n }' data.txt
于 2012-09-10T13:54:36.623 に答える
3

awk の使用:

/^[^_]+_[^=]+=[0-9]+$/ {sum=sum+$2; cnt++}
END {
    print "sum:", sum, "items:", cnt, "avg:", sum/cnt
}

$ awk -F= -f cnt.awk data.txt
sum: 55 items: 10 avg: 5.5

純粋な bash ソリューション:

#!/bin/bash

while IFS='=' read str num
do
    if [[ $str == *_* ]]
    then
        sum=$((sum + num))
        cnt=$((cnt + 1))
    fi

done < data.txt

echo "scale=4; $sum/$cnt" | bc ;exit

出力:

$ ./cnt.sh 
5.5000
于 2012-09-10T13:48:45.723 に答える
3

次のようにする必要があります。

... | grep 'x_y=' | perl -ne '$x += (split /=/, $_)[1]; $y++ }{ print $x/$y, "\n"'

}{口語的にエスキモー オペレータ-nと呼ばれ、 の周りに配置されるコードのために機能します-e(「 」を参照perldoc perlrun)。

于 2012-09-10T13:33:47.433 に答える
0

ワンライナーとして、コメントで分割します。

perl -nlwe '
    push @a, /x_y=(\d+)/g          # push all matches onto an array
    }{                             # eskimo-operator, is evaluated last
    $sum += $_ for @a;             # get the sum
    print "Average: ", $sum / @a;  # divide by the size of the array
' input.txt

複数の一致が存在する場合、1 行に複数の一致を抽出します。

貼り付けバージョン:

perl -nlwe 'push @a, /x_y=(\d+)/g }{ $sum += $_ for @a; print "Average: ", $sum / @a;' input.txt
于 2012-09-10T17:25:28.683 に答える