たとえば、cut
コマンドは、パラメータ-fを取ることができ、man
これらのフィールドのみを選択してください。 -sオプションが指定されていない限り、区切り文字を含まない行も印刷します
この文脈で、フィールドとは何ですか?
「フィールド」という用語は、cut
やawk
などのツールに関連していることがよくあります。データを取得し、特定の文字を使用して区切る場合、フィールドは列に相当するデータに似ています。通常、これを行うために使用される文字は Space。
ただし、ほとんどのツールの場合と同様に、構成可能です。例えば:
awk -F"," ...
-カンマで区切ります(つまり、 ,)。cut -d"," ...
-カンマで区切ります(つまり、 ,)。最初の1つは、awk
がスペースで自動的に分割される方法を示しています。
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
これは、cut
がスペースでどのように分割されるかを示しています。
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
ここに、1列目と4列目を返すためにcut
を使用している列データの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.
このスイッチに関しては、-d
スイッチで指定された区切り文字を含まない行を出力しないようにcut
に指示するだけです。
このファイルがあったとしましょう。
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
注:上記の2番目の文字列にはスペースとタブがあります。
ここで、-s
スイッチの有無にかかわらず、cut
を使用してこれらの文字列を処理する場合:
$ 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
の場合、「フィールド」はテキスト行の先頭から始まり、最初のタブまですべてが含まれます。 2番目のフィールドは、最初のタブの後の文字から次のタブまで続きます。そして、3番目、4番目、というように...タブの間、または行の始まりとタブの間、またはタブと行の終わりの間のすべて。
「-d」オプションでフィールド区切り文字を指定しない限り:cut -d: -f2
は、最初と2番目のコロン( ':')文字の間のすべてを取得します。
他のユーティリティでは定義が異なりますが、タブ文字が一般的です。 awk
は1つ以上の空白文字に基づいてフィールドを分割するため、cut
が厳しすぎる場合はawk
が適切なフォールバックです。多くの状況では、これは少し自然ですが、構文を少し知っておく必要があります。 awk
に従って2番目のフィールドを印刷するには:
awk '{print $2}'
sort
は私をだますものです。私の現在のsort
マニュアルページには、フィールドセパレータの「非空白から空白への遷移」のようなものがあります。何らかの理由で、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
は、区切り文字が1文字で、入力フィールドのサブセットを同じ順序で出力したい場合(-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
オプションは間違いやすいです。