回答:
2行の最も顕著な違いは、入力に依存します。フィールド区切り文字としてcut
1文字を使用し-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
。
cut
Awk 単独よりも高速である可能性が高いですが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
?