GNU/Linux >> Linux の 問題 >  >> Linux

切り取りコマンドの「フィールド」を構成するものは何ですか?

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

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

  • 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.

ここに、使用している列データの CSV リストがあります cut 列 1 と 4 を返します。

$ 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 は、さまざまな分離文字の処理にも少し長けています。ここでは タブ を扱っています スペースとともに それらが同時に混ざり合っている場所:

$ 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  

2 番目の例では、-s が switch は、区切り文字 Space を含まない文字列を出力から除外しました .


POSIX によるフィールドは、IFS のいずれかの文字で区切られた行の一部です。 、「入力フィールド区切り (または内部フィールド区切り これのデフォルト値は、スペース、水平タブレータ、改行が続きます。Bash では、printf '%q\n' "$IFS" を実行できます。


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

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

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

awk '{print $2}'

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

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


Linux
  1. コマンド単一引数の最大サイズを定義するものは何ですか?

  2. `builtin`ビルトインが必要ですか?

  3. Ubuntu のツリー コマンドとは何ですか?

  1. 最初の行の最初のフィールドを出力する cut または awk コマンド

  2. Mac 用の Linux の updatedb コマンドに相当するものは何ですか?

  3. Windows の Linux の File コマンドに相当するものは何ですか?

  1. Linux test -a コマンド テストとは何ですか?

  2. cd ` (バックティック) の目的は何ですか?

  3. useradd コマンドでオプション -o を使用するとは何ですか?