web-dev-qa-db-ja.com

カットコマンドの「フィールド」とは何ですか?

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

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

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

16
luca590

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

ただし、ほとんどのツールの場合と同様に、構成可能です。例えば:

  • awk = awk -F"," ...-カンマで区切ります(つまり、 ,)。
  • cut = 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.

カットする-sスイッチはどうですか?

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

19
slm

POSIXによるフィールドは、 IFS 、「 入力フィールド区切り記号(または内部フィールド区切り記号 "デフォルトこの値はスペースであり、その後に水平タブレータが続き、その後に改行が続きます。 Bashを使用すると、printf '%q\n' "$IFS"その値を確認します。

8
l0b0

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

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

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

awk '{print $2}'

sortは私をだますものです。私の現在のsortマニュアルページには、フィールドセパレータの「非空白から空白への遷移」のようなものがあります。何らかの理由で、sortフィールドを正しく定義するために数回の試行が必要です。 joinは、「空白で区切られた」フィールドを使用しているようです。これは、awkがデフォルトで行うことを意図していることです。

話の教訓は注意深く、知らない場合は実験することです。

2
Bruce Ediger

「フィールド」という用語は、一般的にLinuxに関連しているのではなく、特定のプログラムに関連しています。したがって、cutsortとは異なる種類のフィールドを使用します。

cutでは、各行のフィールドを区切るオプション-dでフィールド区切り文字を指定することにより、自分でフィールドを定義します。

データが行でコロンで区切られている場合は、-dおよび-fを使用して、フィールド(または列)2、3、6を次のように取得します。

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
2
Volker Siegel

cutコマンドを使用すると、2つの主要な引数を取ります

-d:区切り文字を表す

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

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

ここで、outputは区切り文字「|」で区切られますそしてそれは入力ファイルから2つのフィールドだけをカットします

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

Alex|120000|Admin|1999

次に、2つのフィールドをカットします

Alex|120000
1
Shah Honey

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オプションは間違いやすいです。

0