ファイルから各文章の数を取得する方法

ファイルから各文章の数を取得する方法
grep '[".?!"]'

これらのいずれかがある行を返しますが、各行にいくつがあるかはわかりません。 、?そして!

答え1

これにより、ファイル内のすべての句読点文字のリストが1行に1つずつ、ファイル内の対応する文字数に基づいて各句読点文字のリストが印刷されます。

grep -o '[[:punct:]]' file | sort | uniq -c 

私は/var/log/syslogを実行してテストするのが好きです。現在、私のラインは150,000を超えています。

答え2

ファイル内のこれらの句読点の合計数を見つけるには、他のtrすべての句読点を削除してからwc数を数えることができます。

tr -dc '.?!' | wc -c

答え3

これは、またはを.含む行を検索するawkスクリプトです。句読点を含む各行の行番号、見つかった各トークンの数、行内のトークンの総数を印刷します。データが終了すると、合計が印刷されます。?!

catコマンドラインから複数のファイル名を渡すことができ、すべてのファイルをまとめたように動作しますが、各ファイルを個別に処理するようにこのスクリプトを変更するのは非常に簡単です。

#!/usr/bin/awk -f

# Count punctuation marks
# See http://unix.stackexchange.com/q/239894/88378
# Written by PM 2Ring 2015.10.131

BEGIN{
    FS = ""
    punc = ".?!"
    fmt = "%5s: .=%s, ?=%s, !=%s, all=%s\n"
}

/[.?!]+/{
    #print NR, $0, NF
    count[1] = count[2] = count[3] = 0
    for(i=1; i<=NF; i++)
    {
        n = index(punc, $i)
        if(n)
            count[n] += 1
    }
    all = count[1] + count[2] + count[3]
    printf fmt, NR, count[1], count[2], count[3], all
    for(i=1; i<=3; i++)
        total[i] += count[i]
}

END{
    all = total[1] + total[2] + total[3]
    printf fmt, "Total", total[1], total[2], total[3], all
}

以下は、このスクリプトのテストに使用したランダムなデータです。

Some test data
.a.?? .u o..ru. !!?aarl.?...t  s
e.?a.eli?.?s.. ?.r. s.t .e.a.le!
ti h  ..rs.  ?er.t. dn!t?.?.l.?t
?.n!rer e. d..!???? a .!..a.tit.
No punctuation
!.a.n..!isda!.o a!le.d..a.!sh.t?
?!?. ..!i  hi...h iii.?..a i hh?
.h r.u?....t..s !.. a  .li?hs !.
ia tso???.tr?t .hl..i.aids l.?.?
Bye-bye.

生成された出力は次のとおりです。

    2: .=10, ?=4, !=2, all=16
    3: .=11, ?=4, !=1, all=16
    4: .=8, ?=4, !=1, all=13
    5: .=9, ?=5, !=3, all=17
    7: .=10, ?=1, !=5, all=16
    8: .=9, ?=4, !=2, all=15
    9: .=12, ?=2, !=2, all=16
   10: .=7, ?=6, !=0, all=13
   11: .=1, ?=0, !=0, all=1
Total: .=77, ?=30, !=16, all=123

GNU Awk 3.1.7でテストされました。

答え4

sed -e'1{x;s/^/0ddsQsEsD[q]sq/p;x;}' \
    -e'/[^?!.]*\([?!.]\)[^?!.]*/!d;=' \
    -e's// l\11+s\1 /g;s/.*/pc0dds?s!s.&Q?E!D./' \
    -e's/\([QED]\)\(.\)/[l\21>q9P[\2=]Pl\2pl\1+9P[Total: ]Pps\1]x/g' |dc

このコマンドを含む行の場合、その行[?!.]番号が最初に印刷され、次の行の文字数、各コマンドの実行回数が印刷されます。

printf %s\\n \? \?\!. '' hey \? '' '' \! ...hey... .\!\? |
sed -e'1{x;s/^/0ddsQsEsD[q]sq/p;x;}' \
    -e'/[^?!.]*\([?!.]\)[^?!.]*/!d;=' \
    -e's// l\11+s\1 /g;s/.*/pc0dds?s!s.&Q?E!D./' \
    -e's/\([QED]\)\(.\)/[l\21>q9P[\2=]Pl\2pl\1+9P[Total: ]Pps\1]x/g' |dc

1
    ?=1
    Total: 1
2
    ?=1
    Total: 2
    !=1
    Total: 1
    .=1
    Total: 1
5
    ?=1
    Total: 3
8
    !=1
    Total: 2
9
    .=6
    Total: 7
10
    ?=1
    Total: 4
    !=1
    Total: 3
    .=1
    Total: 8

関連情報