回答:
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。
cutAwk 単独よりも高速である可能性が高いですがgrep ... | cut、純粋なAwkよりも高速であるかどうかはそれほど確かではありません。
一般的に言えば、ツールの専門性が高いほど速くなります。だから、ほとんどの場合、あなたが期待することができますcutし、grepより速いことsed、そしてsedより速くしますawk。より複雑なツールを1回呼び出すだけで、より単純なツールの長いパイプラインを比較する場合、経験則はありません。これは、大量の入力(たとえば、数百万行)でのみ重要です。短い入力の場合、違いは見られません。
もちろん、より複雑なツールの利点は、より多くのことができることです。
コマンドは不必要にcatを使用します。代わりにリダイレクトを使用します(特に速度が心配な場合は、おそらくベンチマークを実行するまで速度を心配するべきではありませんが¹)。
<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '
これらのコマンドはほぼ同等です。違いは次のとおりです。
grep -Eほぼ同じ正規表現構文(拡張正規表現)があります。cut -d ' '個々のスペース文字を区切り文字として扱います。Awkのデフォルトの区切り文字は、複数のスペースやタブなどの空白シーケンスcutです。任意の空白シーケンスを区切り文字として使用することはできません。awkで区切り文字として個々のスペースを使用するには、フィールド区切り文字を、単一スペースで構成される正規表現(「任意の空白シーケンス」を意味する特別な場合、つまりデフォルト)以外の単一スペースに一致する正規表現に設定しますawk -F '[ ]' '/WORD/ {print $2}'。¹ プログラム最適化の最初のルール:しないでください。プログラム最適化の2番目のルール(専門家のみ!):まだやらないでください。— マイケル・A・ジャクソン
あなたの命令、
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で実行できます。
grep WORD filename。
echo filenameかcat filename?