各単語が異なる文字で始まる大文字で行を印刷します。

各単語が異なる文字で始まる大文字で行を印刷します。

次のテキストがあります。

FOUR MILLION, EIGHT HUNDRED AND FIFTY-SEVEN THOUSAND, FIVE HUNDRED AND THIRTEEN innovating
FORTY-NINE MILLION, ONE HUNDRED AND EIGHTY THOUSAND, TWO HUNDRED AND FORTY-EIGHT championed
FORTY-SEVEN MILLION, NINE HUNDRED AND FIFTY-TWO THOUSAND, EIGHT HUNDRED AND SIX swashbuckling
NINE HUNDRED AND SIXTY-ONE THOUSAND, SIX HUNDRED AND THIRTY-ONE sprinklers
FORTY-TWO MILLION, TWO HUNDRED AND SIXTY-SIX THOUSAND, THREE HUNDRED AND SEVENTY-TWO furloughs
SEVEN MILLION, FOUR HUNDRED AND SEVENTEEN THOUSAND, FOUR HUNDRED AND FORTY-TWO panicky
THREE HUNDRED AND SEVENTY-NINE THOUSAND, FIVE HUNDRED AND TWENTY-EIGHT anchovies
FIVE MILLION, EIGHT HUNDRED AND FIFTY-NINE THOUSAND, FOUR HUNDRED AND SIXTY-FOUR excesses

 ............

各単語が異なる文字で始まる大文字の行を使用またはgrep印刷する方法は?sed

例えば:

FIFTY THOUSAND, NINE HUNDRED AND EIGHTEEN
FOURTEEN THOUSAND, SEVEN HUNDRED AND NINETY-EIGH

ベストアンサー1

この問題を解決するときに最初にすべきことは、作業に適したツールを選択することです。この問題では、各単語の最初の文字が1行に表示される回数を数える必要があります。 PythongrepsedPythonは少なくともそれ自体では計算に精通していませんが、PythonとPythonは一般的なawkプログラミング言語に近いことはよく知られています。タスクを解決するために単一のツールを使用したい場合は、awkより適切です。

awk '{
    delete count
    for (i = 1; i <= NF; ++i) {
        ch = substr($i,1,1)
        if (ch == toupper(ch) && count[ch]++)
            next
    }
    print
}' file

このコードは、各行のすべての単語の最初の大文字の発生回数を計算します(単語はスペースで区切られた部分文字列です)。countデータの文字で索引付けされた連想配列に数を格納します。

2番目に最初の文字の1つに会うとすぐにその行を捨てます。このように、私たちは捨てないすべての行を印刷します。

このコードは言葉です最初文字は大文字です。すべて 大文字の単語の最初の文字をテストするには、次のコマンドを使用します。

awk '{
    delete count
    for (i = 1; i <= NF; ++i)
        if ($i != toupper($i) && count[substr($i,1,1)]++)
            next
    print
}' file

次の問題はコードを理解することです。あなたはすでに得るこれでコードを使うとうまくいきますが、理由を知らないかもしれません。さらに、少し異なる操作を実行するために修正する方法、またはいくつかの極端な場合に突然失敗した場合は、それを修正する方法がわからない場合があります。

awkマニュアルの各セクションを始点として調べると、コードをよりよく理解できます。その後、なぜ別の場所ではなく特定の場所に書いたのか理解できない場合は、delete count問題について別の質問をすることができます。あるいは、より良い方法は、コードを試して特定の方法で壊れたものを記録することです。

おすすめ記事