カット コマンドの「フィールド」を構成するものは何ですか?

カット コマンドの「フィールド」を構成するものは何ですか?

例えば、cutコマンドはパラメータ-fを取ることができ、man

これらのフィールドのみを選択します。-s オプションが指定されていない限り、区切り文字を含まない行も出力します。

この文脈では、フィールドとは何でしょうか?

答え1

「フィールド」という用語は、多くの場合、 や などのツールに関連付けられますcutawkフィールドは、データを取得して特定の文字を使用して区切った場合、列に相当するデータに似ています。通常、これを行うために使用される文字は ですSpace

ただし、ほとんどのツールと同様に、設定可能です。例:

  • awk = awk -F"," ...- はカンマで区切ります (つまり,)。
  • cut = 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 の -s スイッチはどうでしょうか?

このスイッチに関しては、スイッチ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  

-s2 番目の例では、スイッチによって区切り文字を含まない文字列が出力から省略されていることがわかりますSpace

答え2

POSIXによれば、フィールドとは、以下のいずれかの文字で区切られた行の一部である。IFS、"入力フィールドセパレーター(または内部フィールドセパレータ)。" このデフォルト値は、スペース、水平タブ、改行の順です。Bash では、を実行してprintf '%q\n' "$IFS"値を確認できます。

答え3

ユーティリティによって異なりますが、 の場合cut、「フィールド」はテキスト行の先頭から始まり、最初のタブまでのすべてが含まれます。2 番目のフィールドは、最初のタブの次の文字から次のタブまでです。3 番目、4 番目、... と続きます。タブ間、または行頭とタブ間、またはタブと行末の間のすべてが含まれます。

「-d」オプションでフィールド区切り文字を指定しない限り、cut -d: -f2最初のコロン (':') 文字と 2 番目のコロン (':') 文字の間にあるすべての内容が取得されます。

他のユーティリティでは定義が異なりますが、タブ文字が一般的です。 は、1 つ以上の空白文字に基づいてフィールドを分割するため、厳しすぎるawk場合に適切な代替手段です。これは多くの状況でより自然ですが、構文を少し知っておく必要があります。 に従って 2 番目のフィールドを印刷するには、次のようにします。cutawkawk

awk '{print $2}'

sort私を騙すのはこれです。現在のsortマニュアル ページには、フィールド区切り文字として「非空白から空白への移行」のようなことが書かれています。何らかの理由で、sortフィールドを正しく定義するには数回の試行が必要です。joinどうやら「空白で区切られた」フィールドを使用しているようです。これがawkデフォルトで行われることになっています。

この話の教訓は、注意して、分からない場合は実験してみることです。

答え4

コマンドを使用する場合cut、2つの主な引数が必要です

-d : 区切り文字を表す

-f : 入力ファイルから切り取るフィールドを表します

Ex. cut - d "|"  - f1, 2 input_filename

ここではoutput区切り文字「|」で区切られ、入力ファイルから2つのフィールドのみが切り取られます。

ファイルに次の行がある場合

Alex|120000|Admin|1999

次に、2つのフィールドを切り取ります。

Alex|120000

関連情報