行の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 の反復を試行していますが、目的の出力を取得できません
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
要求されたawk
アプローチを使用して質問に回答しませんが、cut
をこのタスクに使用できることを指摘しておきます。
cut -f4- -d' ' input
コマンド
awk '{$1=$2=$3="";print $0}' filename| sed -r "s/^\s+//g"
コマンド
cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3
保持するフィールド間の間隔を保持したい場合は、次のようにすることもできます。
<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>
出力が得られます。
フィールド区切り文字で正規表現をサポートする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
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
デフォルトでは、改行を挿入します。 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
}'
いかがですか
awk 'sub ("^" $1 FS $2 FS $3 FS, _)' file
cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3
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
の後に出力行セパレーターを追加します。-a
:split
配列の各行@F
、デフォルトでは空白文字。-F
:空白ではなく、提供されたパターンのsplit
。
@F[3..$#F]
:3
から$#F
(@F
の最後の要素)までのインデックスを持つフィールド。インデックスはゼロから始まります。
_$ 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
_