awkとgrepを使用したcutの正確な違いは何ですか?[閉まっている]


30

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

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

または

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

私の質問は:

  • 上記の2つのコマンドの違いは何ですか?
  • どれが最高のパフォーマンスを発揮しますか?
  • を使用するawkよりも使用することの利点は何cutですか?
  • どのオプションがawk私たちに与えてくれますcutか?

それecho filenamecat filename
アビナッシュラジ

@AvinashRaj申し訳ありませんが編集
Networker

回答:


35

2行の最も顕著な違いは、入力に依存します。フィールド区切り文字としてcut1文字を使用し-d(デフォルトはTAB)、その文字が出現するたびに新しいフィールドが開始されます。awkただし、より柔軟です。区切り文字はFS変数内にあり、空の文字列(入力文字ごとに個別のフィールドを作成)、単一の文字、または正規表現を使用できます。単一スペース文字の特殊なケース(デフォルト)は、空白のシーケンスで分割することを意味します。また、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間の空間の配列に分割abcし、def一方のcutセパレータとしてすべてのスペースをとります。

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


答えとして欲しいもの、ありがとうございます。質問に回答済みとしてマークします@Dubu
Networker

1
cutAwk 単独よりも高速である可能性が高いですがgrep ... | cut、純粋なAwkよりも高速であるかどうかはそれほど確かではありません。
ワイルドカード

8

一般的に言えば、ツールの専門性が高いほど速くなります。だから、ほとんどの場合、あなたが期待することができますcutし、grepより速いことsed、そしてsedより速くしますawk。より複雑なツールを1回呼び出すだけで、より単純なツールの長いパイプラインを比較する場合、経験則はありません。これは、大量の入力(たとえば、数百万行)でのみ重要です。短い入力の場合、違いは見られません。

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

コマンドは不必要にcatを使用します。代わりにリダイレクトを使用します(特に速度が心配な場合は、おそらくベンチマークを実行するまで速度を心配するべきではありませんが¹)。

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

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

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

¹ プログラム最適化の最初のルール:しないでください。プログラム最適化の2番目のルール(専門家のみ!):まだやらないでください。マイケル・A・ジャクソン


1

あなたの命令、

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

catコマンドさえ必要ありません。試してみてください

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

そして、以下のコマンドはcatからgrepに出力をリダイレクトし、次にcutにリダイレクトします。

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

おそらく、出力のリダイレクトを回避する必要があります。Awkはジョブを1 行で実行しますが、特定の単語を含む行のみを取得cutするgrepコマンドが必要で、区切りスペースに従って列2を出力します。

cutが失敗した場合は、awkで実行できます。


3
ps grepのcatコマンドも必要ありません。あなただけができますgrep WORD filename
フープ

@ edvinas.meうん。
アビナッシュラジ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.