シェルでは、特定の列が必要なときにawkにパイプします。
これにより、列9が出力されます。次に例を示します。
... | awk '{print $9}'
列9だけでなく、列9を含むすべての列を印刷するようにawkに指示するにはどうすればよいですか?
回答:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
かperl
、これに使用する方が良いと思います。あなたが本当にそれをに持つことを主張する場合にのみこれを使用してくださいawk
。
さまざまなフィールドを実行したい場合、awk
これを実行する簡単な方法は実際にはありません。cut
代わりに私はお勧めします:
cut -d' ' -f 9- ./infile
デフォルトがタブであるため、スペースフィールド区切り文字が追加されました。これを指摘してくれたGlennに感謝します
find . | xargs ls -l | cut -d' ' -f 9-
。何らかの理由で、ダブルスペースもカウントされます。例:lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
結果は./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
編集:注:9番目より前のフィールドに9番目と同じ値が含まれている場合、これは機能しません。
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
可変幅の空白を処理する代わりに、すべての空白を単一のスペースとして置き換えます。次にcut
、関心のあるフィールドでsimpleを使用します。
それはawkを使用しないので、密接な関係はありませんが、他の回答/コメントを考えると適切であるように思われました。
ps faux |
使用に理想的です。ツールXYZが最も適切ではないことを認めることを恐れないでください。
通常、perlはawk / sed / grepetを置き換えます。al。、そしてはるかにポータブルです(そしてより良いペンナイフであるだけでなく)。
perl -lane 'print "@F[8..$#F]"'
もちろん、Timtowtdiが適用されます。
-l
を追加\n
するか、printステートメントに追加する必要があります。
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
これにより、指定されたフィールドnr。、Nの前にあるものが切り取られ、フィールドnr.Nを含み、元の間隔を維持しながら、行の残りすべてが出力されます(再フォーマットされません)。フィールドの文字列が行の別の場所にも表示されているかどうかは問題ではありません。これは、Aschererの回答の問題です。
関数を定義します。
fromField () {
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
そして、次のように使用します。
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
出力は、末尾のスペースを含むすべてを維持します。N= 0の場合は行全体をそのまま返し、n> NFの場合は空の文字列を返します。
ls -l
出力の例を次に示します。
-rwxr-----@ 1 ricky.john 1493847943 5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john 1493847943 27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john 1493847943 21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john 1493847943 10627144 Apr 16 14:09 03-Where to Get Help.mp4
投稿を印刷する私の解決策$9
はawk '{print substr($0, 61, 50)}'
最初の3つのフィールドを表示し、残りのフィールドを印刷するには、次を使用できます。
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
ここで、$ 1 $ 2 $ 3は最初の3つのフィールドです。