web-dev-qa-db-ja.com

awkを使用して特定の数値の後にすべての列を印刷する方法は?

シェルでは、特定の列が必要なときにawkにパイプします。

これにより、列9が印刷されます。例:

... | awk '{print $9}'

列9だけでなく、すべての列列9を含むを印刷するようにawkに指示するにはどうすればよいですか?

73
Lazer
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
75
Amadan

ある範囲のフィールドを実行したい場合、awkにはこれを行うための簡単な方法はありません。代わりにcutをお勧めします:

cut -d' ' -f 9- ./infile

編集

デフォルトはタブであるため、スペースフィールドの区切り文字を追加しました。これを指摘してくれたグレンに感謝

55
SiegeX
awk '{print substr($0, index($0,$9))}'

編集:9番目より前のフィールドに9番目と同じ値が含まれている場合、これは機能しません。

50
Ascherer
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-

可変幅の空白を処理する代わりに、すべての空白を単一のスペースとして置き換えます。次に、目的のフィールドで単純なcutを使用します。

それはawkを使用しないため、密接な関係はありませんが、他の回答/コメントを考えると適切であると思われます。

10
Some Fool

一般に、Perlはawk/sed/grep etを置き換えます。また、muchより移植性があります(だけでなく、より良いペンナイフでもあります)。

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

もちろんTimtowtdiが適用されます。

7
bobbogo
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の場合は空の文字列が返されます。

2
Robert Vila
function print_fields(field_num1, field_num2){
    input_line = $0

    j = 1;
    for (i=field_num1; i <= field_num2; i++){
        $(j++) = $(i);

    }
    NF = field_num2 - field_num1 + 1;
    print $0

    $0 = input_line
}
0
msol01
Ruby -lane 'print $F[3..-1].join(" ")' file
0
kurumi

Awkの代わりにcutを使用し、-c character cutコマンドを使用して、開始する列を特定する際の問題を克服します。

ここで、出力の最初の49文字を除くすべてを教えてください。

 ls -l /some/path/*/* | cut -c 50-

/*/*/ lsコマンドの最後に、サブディレクトリにあるものを見せてくださいと言っています。

また、特定の範囲の文字alaを引き出すことができます(カットのmanページから)。たとえば、現在ログインしているユーザーの名前とログイン時間を表示します。

       who | cut -c 1-16,26-38
0
Joe

以下は_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)}'です

0
rickydj

最初の3つのフィールドを表示し、残りのフィールドを印刷するには、次を使用できます。

awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename

$ 1 $ 2 $ 3は最初の3つのフィールドです。