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

最初のn列と最後のn列を切り取る方法は?

Cut は -f で複数の範囲を取ることができます :

4 列まで、7 列以降:

cut -f -4,7-

またはフィールド 1、2、5、6 および 10 以降の場合:

cut -f 1,2,5,6,10-

など


質問の最初の部分は簡単です。すでに指摘したように、cut は列範囲の開始インデックスまたは終了インデックスの省略を受け入れ、これを「開始から列 n まで」のいずれかを意味すると解釈します。 (包括的)」または「列 n から」 (包括的) 最後まで」、それぞれ:

$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test

結合もサポートしています 範囲。必要に応じて、たとえば、7 列の行の最初の 3 列と最後の 2 列:

$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz

ただし 質問の 2 番目の部分は、期待している入力の種類によっては少し難しくなる可能性があります。 If by “last n 列」とは「最後の n」という意味です 列 (行全体のインデックスに関係なく)」(つまり、事前に検索する列の数が必ずしもわからないため) の場合、残念ながら cut を使用してこれを達成することはできません。 1人。 cutを有効に使うために 「最後のn」を引き出す 各行の列」、合計数 および、各行に存在する列の数を事前に知っておく必要があります 各行は、含まれる列の数において一貫している必要があります。

しない場合 各行にいくつの「列」が存在するかを知っている場合 (たとえば、厳密に表形式ではない入力を扱っているため)、awk のようなものを使用する必要があります。 代わりは。例:awk を使用するには 最後の 2 つの「列」を引き出します (awk はそれらを fields と呼びます) 入力の各行から:

$ printf '/a\n/a/b\n/a/b/c\n/a/b/c/d\n' | awk -F/ '{print $(NF-1) FS $(NF)}'
/a
a/b
b/c
c/d

AWK を使用して最初と最後のフィールドを切り取るには:

awk '{$1 = ""; $NF = ""; print}' inputfile

残念ながら、それではフィールド セパレータが残ってしまうので、

aaa bbb ccc

[space]bbb[space]

これを行うには、余分なスペースを残さないくるみの回答を使用しますが、要件に固有の方法で行います:

awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile

これにより、その回答のいくつかの問題も修正されます。

それを一般化するには:

awk -v skipstart=1 -v skipend=1 '{delim = ""; for (i=skipstart+1;i<=NF-skipend;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile

次に、コマンドの先頭で変数の割り当てを変更することにより、先頭または末尾でスキップするフィールドの数を変更できます。


次を使用してカットできます。
-d:デリミタ、フィールドの場合は -f
\t タブ区切りのフィールドに使用

cut -d$'\t' -f 1-3,7-

Linux
  1. 方法:DRBDのレプリケーションと構成

  2. Debian 10 で最初の Qt プログラムを作成して実行する方法

  3. 3番目の列を最後の列に印刷する方法は?

  1. Awkおよび正規表現を使用してファイル内のテキストまたは文字列をフィルタリングする方法

  2. シェルのコマンド出力から最初/最後の「n」行を削除するにはどうすればよいですか?

  3. 「カット」を使用して最後のフィールドを見つける方法

  1. 列の操作– AwkとSed?

  2. 最初と最後の行なしでファイルコンテンツを印刷しますか?

  3. Cut / Grep And Df -h?