コマンドの出力を tr コレクションとして使用

コマンドの出力を tr コレクションとして使用

システムプログラミングでは、サンプルテキストを確認し、最も一般的な単語を別のフレーズに置き換える必要がありました。残念ながら、私はコマンドしか使用できません

tr
grep
egrep
sed
awk
uniq
wc

そしてパイプライン。最も一般的な単語を見つけて、trのSET1に使用して他のフレーズに置き換えることができるようにしたいと思います。これを行うには、grepやsedなどに関連する行/単語をフィルタリングする必要があるようです。私の質問は、フレーズを置き換えるためにこれをtrの最初のセットに渡す方法です。私はawkの経験がありません。

答え1

単一文字(またはバイト)でのみ機能するため、trこれを使用したくありません。tr

$ echo abc | tr cab taxi
axt

sed特にs///(代替)演算子を調べることをお勧めします。

あるプログラムの出力を別のプログラムのコマンドラインにパイプする場合、キーワードは次のようになります。コマンドの置き換え

(宿題なので詳しく説明しません…)

答え2

この宿題は2週間以上経ったので、私の解決策をお知らせします(最も一般的なスペースで区切られた単語を文字列に置き換えますFOO!)。


#!/usr/bin/awk -f

{
    for (i = 1; i <= NF; ++i)
        if (NR == FNR) {
            if (++c[$i] > c[m])
                m = $i
        } else {
            if ($i == m)
            $i = "FOO!"
        }
}

NR != FNR

awkこのスクリプトは、コマンドラインで2回参照されたファイルを使用して呼び出す必要があります。

$ ./script.awk file file

このスクリプトの唯一の欠点は、最も一般的な単語を含む行のスペースが単一のスペースに圧縮されることです。


上記の問題を解決するバリエーション(または少なくともより良いパフォーマンス):


#!/usr/bin/awk -f

NR == FNR {
    for (i = 1; i <= NF; ++i)
        if (++c[$i] > c[m])
            m = $i
}

NR != FNR { gsub(FS m FS, FS "FOO!" FS) print }

関連情報