web-dev-qa-db-ja.com

n番目の列から最後までのawk印刷

行のnthからlastまでのすべての列を印刷したい

ファイルに文字列を入力

vddp vddpi vss cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3  

コマンド

cat <file> | awk ' { for (i=3; i<=NF; i++)   print $i }'

現在の出力

cb0
cb1
cb2
cb3
ct0
ct1
ct2
ct3

望ましい出力

cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3

awk の反復を試行していますが、目的の出力を取得できません

10
JigarGandhi
awk -v n=4 '{ for (i=n; i<=NF; i++) printf "%s%s", $i, (i<NF ? OFS : ORS)}' input

これはnの値としてnを取り、最後のフィールドNFを介してその数をループします。反復ごとに現在の値を出力します(それが行の最後の値でない場合) OFSをその後ろ(スペース)に出力します。それがその行の最後の値である場合は、その後ろにORSを出力します(改行)。

$ echo 'vddp vddpi vss cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3' |
> awk -v n=4 '{ for (i=n; i<=NF; i++) printf "%s%s", $i, (i<NF ? OFS : ORS)}'
cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3
12
jesse_b

要求されたawkアプローチを使用して質問に回答しませんが、cutをこのタスクに使用できることを指摘しておきます。

cut -f4- -d' ' input
12
steve

コマンド

awk '{$1=$2=$3="";print $0}' filename| sed -r "s/^\s+//g"

コマンド

cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3
8

保持するフィールド間の間隔を保持したい場合は、次のようにすることもできます。

<file awk '{sub(/^[[:blank:]]*([^[:blank:]]+[[:blank:]]+){3}/, ""); print}'

(ただし、POSIXであっても、すべてのawk実装が{3}をサポートしているわけではないことに注意してください)。

つまり、最初の3つのフィールドに一致する正規表現を使用します。

または単にsedを使用してそれを行います:

<file sed 's/^[[:blank:]]*\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{3\}//'

これらは、入力のすべての行に少なくとも4つのフィールドがあることを前提としています。

a b c d <tab>e f <nl>入力では、d <tab>e f <nl>出力が得られます。

6

フィールド区切り文字で正規表現をサポートするawkを使用すると、次のことができます。

awk -F'^[[:blank:]]*([^ \t]*[ \t]+){3}' '{ print $2 }' infile
cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3

{3}の数値3を最初から無視する必要がある列の数に置き換えます。列と空白以外で区切られたフィールドセパレータ付きのスペース/タブ。したがって、$2を出力すると、残りの列が最後まで残ります。このソリューションでは、結果としてフィールド間の複数の空白が保持されます。

notes:3フィールド以下の行がある場合に空の行を出力しないようにするには(切り出す必要のある列の#(数)を示します)、NF>1をコマンドに追加します。

awk -F'^[[:blank:]]*([^ \t]*[ \t]+){3}' 'NF>1{ print $2 }' infile

[[:blank:]]*は、FSが空白である場合、誤った出力を回避するために使用されます。FSが他のものである場合(例:コンマ,)、その後、コマンドはさらに簡単になります:

awk -F'^([^,]*,){3}' 'NF>1{ print $2 }' infile
3
αғsнιη

Python= 2で試した:

#!/usr/bin/python
k=open('filename','r')
for i in k:
    k=i.strip().split(' ')[3:]
    print " ".join(k)

出力

cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3
2

デフォルトでは、改行を挿入します。 printの代わりにprintfを使用します

echo "vddp vddpi vss cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3" | awk ' { for (i=4; i<=NF; i++) printf "%s " ,$i }'

複数行の場合:

cat filename.txt | awk ' { for (i=4; i<=NF; i++) 
if (i==NF) 
printf "%s\n", $i
else
printf "%s ", $i
}'
1
koolwithk

いかがですか

awk 'sub ("^" $1 FS $2 FS $3 FS, _)' file
cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3  
1
RudiC

Perlソリューション:

スペース区切り:

Perl -lane 'print "@F[3..$#F]"' file

タブ区切り:

Perl -F'\t' -lane 'print join "\t", @F[3..$#F]' file

ここでは、コマンドラインフラグは次のとおりです。
-e:ファイル内のコードではなくインラインコードを使用するようにPerlインタープリターに指示します。
-n:入力行を一度に1行ずつループして、入力行を$_に割り当てます。
-l:ワンライナーのコードの前に入力行セパレーター(UNIXでは新しい行)を取り除き、printの後に出力行セパレーターを追加します。
-asplit配列の各行@F、デフォルトでは空白文字。
-F:空白ではなく、提供されたパターンのsplit

@F[3..$#F]3から$#F@Fの最後の要素)までのインデックスを持つフィールド。インデックスはゼロから始まります。

0
Timur Shtatland

フィールドを削除した後、空白を保持します。

_$ sed -E 's/^[[:blank:]]*([^[:blank:]]+[[:blank:]]*){3}//' file
$ awk '{sub(/^[[:blank:]]*([^[:blank:]]+[[:blank:]]*){3}/,"")};1' file
$ grep -oP '^[[:blank:]]*([^[:blank:]]+[[:blank:]]*){3}\K.*' file
_

説明文

フィールドを正規表現に一致させる方法があります:_[[:blank:]]*[^[:blank:]]+_。
空白(スペースまたはタブ)のオプションのストリームと、それに続く空白以外のストリームを照合します。そのパターンが3回繰り返された場合、3つのフィールド(先頭に空白がある)が一致します。次に、正規表現を処理できるツールを使用してそれらを削除できます(バリエーションあり)。各フィールドの前後に空白が存在する可能性があることに注意してください。空白も一致させる必要があります。 先行の空白と区切り末尾の空白を一致させると、正規表現が少し長くなります:^[[:blank:]]*([^[:blank:]]+[[:blank:]]*){n}ここで、nは最後を指す整数ですフィールドが一致しました。

GNU awk:

_$ awk -vrem=3 '{ 
                 n=split($0,f,FS,seps);
                 for(i=rem+1;i<=n;i++){
                                        printf("%s%s",$i,seps[i])
                                      };
                 print ""
               }
              '  file
_

空白が折りたたまれています

_$ awk '{$1=$2=$3=""; $0=$0; $1=$1 } 1 ' file      # thanks RudiC
_
0
Isaac