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-