シェルでは、特定の列が必要なときにawkにパイプします。
これにより、列9が印刷されます。例:
... | awk '{print $9}'
列9だけでなく、すべての列列9を含むを印刷するようにawkに指示するにはどうすればよいですか?
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
ある範囲のフィールドを実行したい場合、awk
にはこれを行うための簡単な方法はありません。代わりにcut
をお勧めします:
cut -d' ' -f 9- ./infile
デフォルトはタブであるため、スペースフィールドの区切り文字を追加しました。これを指摘してくれたグレンに感謝
awk '{print substr($0, index($0,$9))}'
編集:9番目より前のフィールドに9番目と同じ値が含まれている場合、これは機能しません。
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
可変幅の空白を処理する代わりに、すべての空白を単一のスペースとして置き換えます。次に、目的のフィールドで単純なcut
を使用します。
それはawkを使用しないため、密接な関係はありませんが、他の回答/コメントを考えると適切であると思われます。
一般に、Perlはawk/sed/grep etを置き換えます。また、muchより移植性があります(だけでなく、より良いペンナイフでもあります)。
Perl -lane 'print "@F[8..$#F]"'
もちろんTimtowtdiが適用されます。
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の場合は空の文字列が返されます。
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
}
Ruby -lane 'print $F[3..-1].join(" ")' file
Awkの代わりにcutを使用し、-c character cutコマンドを使用して、開始する列を特定する際の問題を克服します。
ここで、出力の最初の49文字を除くすべてを教えてください。
ls -l /some/path/*/* | cut -c 50-
/*/*/
lsコマンドの最後に、サブディレクトリにあるものを見せてくださいと言っています。
また、特定の範囲の文字alaを引き出すことができます(カットのmanページから)。たとえば、現在ログインしているユーザーの名前とログイン時間を表示します。
who | cut -c 1-16,26-38
以下は_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つのフィールドです。