回答:
用語「フィールド」は、多くの場合のようなツールに関連付けられた時間であるcut
とawk
。データを取得し、特定の文字を使用してデータを分離する場合、フィールドはデータに相当する列に似ています。通常、これを行うために使用される文字はSpaceです。
ただし、ほとんどのツールの場合と同様に、構成可能です。例えば:
awk -F"," ...
-コンマで区切られます(つまり,)。cut -d"," ...
-コンマで区切られます(つまり,)。最初の例はawk
、スペースで自動的に分割する方法を示しています。
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
これはcut
、スペースでの分割方法も示しています。
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
ここには、cut
列1と4を返すために使用している列データのCSVリストがあります。
$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4
Awkもこれを行うことができます。
$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
また、Awkは、さまざまな分離文字を扱うのが少し上手です。ここでTabsはSpaces、それらが同時に混合されている場所と一緒に扱っています:
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
このスイッチに関しては、スイッチcut
を介して指定された区切り文字を含まない行を印刷しないように単に指示しています-d
。
このファイルがあるとします。
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
注:上記の2番目の文字列にはスペースとタブがあります。
スイッチを使用cut
して、または使用せずにこれらの文字列を処理するとき-s
:
$ cut -d" " -f1-6 sample.txt
This is a space string.
This is a space
Thisstringcontainsneither.
$ cut -d" " -f1-6 -s sample.txt
This is a space string.
This is a space
2番目の例では、-s
スイッチが区切り文字を含まない文字列を出力から省略していることがわかりますSpace。
POSIXに準拠したフィールドはIFS
、「入力フィールド区切り文字(または内部フィールド区切り文字)」のいずれかの文字で区切られた行の一部です。このデフォルト値は、スペース、水平タブ、改行の順になります。 。Bashを使用するprintf '%q\n' "$IFS"
と、実行してその値を確認できます。
cut
。
cut -d "$IFS"
エラーになり、一方、awk -F"[ \t\n]"
期待どおりに動作
問題のユーティリティに依存しますがcut
、「フィールド」はテキスト行の先頭から始まり、最初のタブまでのすべてを含みます。2番目のフィールドは、最初のタブの後の文字から次のタブまで続きます。そして3番目、4番目、…タブ間、行頭とタブ間、またはタブと行末の間のすべて。
「-d」オプションでフィールド区切り文字を指定しない限りcut -d: -f2
、最初と2番目のコロン( ':')文字の間のすべてを取得します。
他のユーティリティには異なる定義がありますが、タブ文字が一般的です。1つ以上の空白文字に基づいてフィールドを分割するため、厳密すぎるawk
場合cut
は適切なフォールバックですawk
。これは多くの状況で少し自然ですが、少し構文を知っておく必要があります。に従って2番目のフィールドを印刷するにはawk
:
awk '{print $2}'
sort
私をだますものです。私の現在のsort
manページには、フィールドセパレーターの「非ブランクからブランクへの移行」などが記載されています。何らかの理由で、sort
フィールドを正しく定義するには数回の試行が必要です。join
明らかに「空白で区切られた」フィールドを使用しますが、これはawk
デフォルトで行うことです。
物語の教訓は注意することであり、知らない場合は実験することです。
「フィールド」という用語は、一般的なLinuxではなく、特定のプログラムに関連しています。したがってcut
、とは異なる種類のフィールドを使用しsort
ます。
を使用してcut
、各行のフィールドを区切るオプション-dでフィールド区切り文字を指定することにより、フィールドとは自分で定義します。
データが行内のコロンで区切られている場合、次のように結合-d
し-f
てフィールド(または列)2、3、6 を取得できます。
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
cut
コマンドを使用する場合、2つの主要な引数を取ります
-d:区切り文字を表します
-f:入力ファイルから切り取られるフィールドを表します
Ex. cut - d "|" - f1, 2 input_filename
ここではoutput
、区切り文字「|」で区切られます 入力ファイルから2つのフィールドのみをカットします
ファイルに次の行がある場合
Alex|120000|Admin|1999
次に、2つのフィールドをカットします
Alex|120000
cut
は、区切り文字が単一の文字であり、入力フィールドのサブセットを同じ順序で出力する単純な場合に最適です(私が指定した場合でも-f3,2,1
、と同じように機能します-f1,2,3
)。
awk
ワンライナーははるかに柔軟です。たとえば、入力フィールドの区切り文字が空白(awk
のデフォルト)である場合、またはフィールドを異なる順序または特定の形式で出力する場合です。
たとえばwc -l myfile | awk '{print $1}'
またls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'
はは非常に単純ですが、で行うのは難しいでしょうcut
。
私は、フィールド/キーsort
が把握するのが難しいという以前のポスターに同意します!のフィールドはjoin
の場合と同じように機能するように見えますがcut
、join
オプションは間違えやすいです。
echo '$IFS' | cat -vet
デフォルト値がでどのように見えるかを確認しますshell
。