DbgViewログファイルから最初の2つの列(興味がない)を削除しようとしています。行3から行末まで印刷する例を見つけることができないようです。各行には可変数の列があることに注意してください。
...またはより簡単な解決策:cut -f 3- INPUTFILE
正しい区切り文字(-d)を追加するだけで、同じ効果が得られます。
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{ print substr($0, index($0,$3)) }'
Jonathan Feinbergの回答は、各フィールドを別々の行に出力します。 printf
を使用して同じ行の出力用にレコードを再構築できますが、フィールドを左に移動するだけでもかまいません。
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file
注意:このメソッドは、1,2,3フィールドに「空白」を残しますが、出力を見たいだけの場合は問題ありません。
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
これは、指定されたフィールドnr。、Nの前を切り取り、フィールドnr.Nを含む行の残りすべてを印刷し、元の間隔を維持します(再フォーマットしません)。フィールドの文字列が行のどこかに表示されている場合、これは問題になりません。これはダイサーの答えの問題です。
関数を定義する:
fromField () {
awk -v m="\x0a" -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'がレコード区切り文字であるファイルに適しているので、行内にその改行文字がありません。他のレコード区切り文字とともに使用する場合は、次を使用します。
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
例えば。 16進文字nrを使用しない限り、ほとんどすべてのファイルでうまく機能します。行内の1。
たとえば、同じ行の3番目以降の列を印刷する場合は、次を使用できます。
awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
例えば:
Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf
印刷されます:
20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf
ご覧のとおり、スペースがある場合でも給与明細は正しい行に表示されます。
次の行はどうですか:
awk '{$ 1 = $ 2 = $ 3 = ""; print} 'ファイル
@ ghostdog74の提案に基づきます。私はあなたが行をフィルタリングするとき、すなわち
awk '/ ^ exim4-config/{$ 1 = "";印刷} 'ファイル
次のawkコマンドは、各行の最後のNフィールドを出力し、行の最後に改行文字を出力します。
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
/ usr/binディレクトリーの内容をリストし、最後の3行を保持し、awkを使用して各行の最後の4列を出力する例を以下に示します。
$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root 14736 Jan 14 2014 bcomps
-rwxr-xr-x 1 root root 10480 Jan 14 2014 acyclic
-rwxr-xr-x 1 root root 35868448 May 22 2014 skype
$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps
Jan 14 2014 acyclic
May 22 2014 skype
まあ、正規表現を使用して同じ効果を簡単に達成できます。区切り文字がスペースであると仮定すると、次のようになります。
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
Perlソリューション:
Perl -lane 'splice @F,0,2; print join " ",@F' file
これらのコマンドラインオプションが使用されます。
-n
入力ファイルのすべての行をループし、すべての行を自動的に印刷しません
-l
は、処理する前に改行を削除し、後でそれらを追加します
-a
自動分割モード–入力行を@F配列に分割します。デフォルトは空白で分割します
-e
Perlコードを実行します
splice @F,0,2
は@F配列から列0と1をきれいに削除します
join " ",@F
は、各要素の間にスペースを使用して、@ F配列の要素を結合します
入力ファイルがスペース区切りではなくコンマ区切りの場合は、-F, -lane
を使用します
Pythonソリューション:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
awk '{a=match($0, $3); print substr($0,a)}'
最初に、3列目の開始位置を見つけます。 substrを使用すると、位置(この場合はa)から行末までの行全体($ 0)を出力します。
Bashでは、定位置パラメーターで次の構文を使用できます。
while read -a cols; do echo ${cols[@]:2}; done < file.txt
詳細: 位置パラメータの処理 Bash Hackers Wiki
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'
4番目のフィールドから最後のフィールドまで、元のファイルと同じ順序でレコードを出力します
ここでは少し遅れていますが、上記のどれも機能していないようです。これを試して、printfを使用して、それぞれの間にスペースを挿入します。最後に改行を入れないことにしました。
awk '{for(i=3;i<=NF;++i) printf("%s ", $i) }'
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'
最初の2列はクリアされ、sed
は先頭のスペースを削除します。
最初の2つのフィールドを無視するだけで、それらのフィールドをマスクするときにスペースが必要ない場合(上記の回答の一部がそうであるように):
awk '{gsub($1" "$2" ",""); print;}' file