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


16

たとえば、cutコマンドは、に応じて、パラメータ-fをとることができますman

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

このコンテキストでは、フィールドとは何ですか?

回答:


19

用語「フィールド」は、多くの場合のようなツールに関連付けられた時間である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は、さまざまな分離文字を扱うのが少し上手です。ここでTabsSpaces、それらが同時に混合されている場所と一緒に扱っています:

$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.

カットする-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  

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


8

POSIXに準拠したフィールドはIFS、「入力フィールド区切り文字(または内部フィールド区切り文字」のいずれかの文字で区切られた行の一部ですこのデフォルト値は、スペース、水平タブ、改行の順になります。 。Bashを使用するprintf '%q\n' "$IFS"と、実行してその値を確認できます。


を実行して、echo '$IFS' | cat -vet デフォルト値がでどのように見えるかを確認しますshell
C0deDaedalus

1
IFSは、シェルによって(すべてではなく)ほとんどの目的で使用されますが、他のプログラムでは使用されませんcut
dave_thompson_085

awkのとは違って、カットも一度に一つだけの区切り文字をサポートしているため、cut -d "$IFS"エラーになり、一方、awk -F"[ \t\n]"期待どおりに動作
JGurtz

2

問題のユーティリティに依存しますがcut、「フィールド」はテキスト行の先頭から始まり、最初のタブまでのすべてを含みます。2番目のフィールドは、最初のタブの後の文字から次のタブまで続きます。そして3番目、4番目、…タブ間、行頭とタブ間、またはタブと行末の間のすべて。

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

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

awk '{print $2}'

sort私をだますものです。私の現在のsortmanページには、フィールドセパレーターの「非ブランクからブランクへの移行」などが記載されています。何らかの理由で、sortフィールドを正しく定義するには数回の試行が必要です。join明らかに「空白で区切られた」フィールドを使用しますが、これはawkデフォルトで行うことです。

物語の教訓は注意することであり、知らない場合は実験することです。


2

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

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

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

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

1

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

-d:区切り文字を表します

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

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

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

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

Alex|120000|Admin|1999

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

Alex|120000

あなたの例は間違ったスペースのために完全に壊れており、たとえ正しいとしても、4年前に与えられた答えには何も追加しません。
dave_thompson_085

0

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の場合と同じように機能するように見えますがcutjoinオプションは間違えやすいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.