次の2つの手法を使用して、必要な行の2列目をファイルから取得できることがわかっています。
awk '/Word/ { print $2 }' filename
または
grep Word filename| cut -f 2 -d ' '
私の質問は:
awk
を使用する場合と比べてcut
を使用する場合の利点は何ですか?awk
はcut
よりもどのようなオプションを提供しますか?2つのライン間の最も顕著な違いは、入力によって異なります。 cut
は、-d
内の1文字をフィールド区切り文字(デフォルトはTAB)として受け取り、その文字が出現するたびに新しいフィールドが開始されます。ただし、awk
はより柔軟です。区切り文字はFS
変数にあり、空の文字列(入力文字ごとに個別のフィールドになります)、単一文字、または正規表現を使用できます。単一の空白文字(デフォルト)の特殊なケースは、空白のsequenceで分割することを意味します。また、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
およびgrep
はsed
よりも高速で、sed
はawk
よりも高速であると予想できます。より単純なツールのより長いパイプラインを、より複雑なツールの1回の呼び出しで比較する場合、経験則はありません。これは、大きな入力(たとえば、数百万行)でのみ問題になります。短い入力の場合、違いはありません。
より複雑なツールの利点は、もちろん、より多くのことができることです。
あなたのコマンドは不必要に猫を使います。代わりにリダイレクションを使用してください(特に、速度が心配な場合は、ベンチマークを実行するまで速度を心配する必要はありません¹)。
<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番目のルール(専門家のみ!):まだ実行しないでください。— Michael A. Jackson
あなたの命令、
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
は特定のWordを含む行のみを取得するためにgrep
コマンドを必要とし、区切り文字スペースに従って列2を出力します。
カットが失敗した場合、あなたはawkで物事を行うことができます。