awkとcut、grepの正確な違いは何ですか? [閉鎖]

awkとcut、grepの正確な違いは何ですか? [閉鎖]

この2つの技術を使用して、ファイルから目的の行の2番目の列を取得できることを知っています。

awk '/WORD/ { print $2 }' filename

または

grep WORD filename| cut -f 2 -d ' '

私の質問は次のとおりです

  • 上記の2つのコマンドの違いは何ですか?
  • どちらが最高のパフォーマンスを持っていますか?
  • awk使用と使用の利点は何であり、cutその逆の場合も同じですか?
  • awk私たちにはどんな選択が与えられましたかcut?その逆も同じですか?

答え1

2つのライン間の最も重要な違いは、入力によって異なります。フィールド区切り文字としてcut単一の文字を使用し(デフォルトはTAB)、この文字が表示されるたびに新しいフィールドが開始されます。しかし、より柔軟です。区切り文字は変数にあり、空の文字列(各入力文字が別々のフィールドを形成する)、単一文字、または正規表現にすることができます。単一の空白文字(デフォルト)の特別な場合は-dawkFS注文するスペース。また、awk先行スペースは基本的に抑制されます。

比較してください:

$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc    def" | cut -f 2 -d ' '

$ echo " abc def" | cut -f 2 -d ' '
abc


$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc    def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def

ここではawk、 との間の空白の順序に基づいて分割が行われ、各スペースは区切り文字として使用されます。abcdefcut

あなたが取るものはあなたが達成したいものに依存します。それ以外の場合はcut小さく、単一目的のツールですが、独自のawkプログラミング言語があるため、より高速であることを願っています。

答え2

一般に、ツールが専門化されるほど、速度は速くなります。したがって、ほとんどの場合、合計は合計より速く、合計より速く、合計より速く、合計よりcut速く、合計よりも高速です。より単純なツールのより長いパイプラインをより複雑なツールの単一の呼び出しと比較する場合、経験則はありません。これは大きな入力(数百万行など)にのみ適しています。短い入力の場合、違いはありません。grepsedsedawk

より複雑なツールの利点はもちろん、より多くの作業を実行できることです。

あなたのコマンドは不必要にcatを使用します。代わりにリダイレクトを使用してください(特にベンチマークを実行する前に速度を心配する必要はありませんが、速度が心配な場合)。

<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '

これらのコマンドはほぼ同じです。違いは次のとおりです。

  • awkとgrepがありますさまざまな正規表現構文。 awkとgrep -Eregexpはほぼ同じ構文(拡張正規表現)を持ちます。
  • cut -d ' '各個別の空白文字を区切り文字として扱います。 awkのデフォルトの区切り文字は、複数のスペース、タブなどになることができる一連のスペースです。任意のスペースシーケンスを区切り文字として使用することはできませんcut。 awkで単一のスペースを区切り文字として使用するには、単一のスペースで構成される正規表現ではなく、単一のスペースに一致する正規表現でフィールド区切り文字を設定します(これは「すべてのスペースシーケンス」を意味する特殊な場合です。つまり、デフォルト) :awk -F '[ ]' '/WORD/ {print $2}'

^ プログラムの最適化の最初の規則: しないでください。プログラム最適化の2番目の規則(専門家のみ):まだ実行しないでください。マイケル・ジャクソン

答え3

注文、

cat fileName | awk '/WORD/ { print $2 }'

cat注文も必要ありません。あなたは試すことができます、

awk '/WORD/ { print $2 }' filename

次のコマンドは、出力をcatからgrepにリダイレクトしてから切り取ります。

cat fileName | grep WORD | cut -f 2 -d ' '

出力リダイレクトを避ける必要があります。 awkはこれを1行で実行しますが、特定の単語を含む行のみを取得し、区切り文字スペースに基づいて列2を印刷するコマンドがcut必要です。grep

切り取りに失敗した場合は、awkでこれらの操作を実行できます。

関連情報