web-dev-qa-db-ja.com

3番目の列を最後の列に印刷する方法は?

DbgViewログファイルから最初の2つの列(興味がない)を削除しようとしています。行3から行末まで印刷する例を見つけることができないようです。各行には可変数の列があることに注意してください。

105
Amit G

...またはより簡単な解決策:cut -f 3- INPUTFILE正しい区切り文字(-d)を追加するだけで、同じ効果が得られます。

99
Marcin
awk '{for(i=3;i<=NF;++i)print $i}' 
99
93
daisaa

Jonathan Feinbergの回答は、各フィールドを別々の行に出力します。 printfを使用して同じ行の出力用にレコードを再構築できますが、フィールドを左に移動するだけでもかまいません。

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
32
awk '{$1=$2=$3=""}1' file

注意:このメソッドは、1,2,3フィールドに「空白」を残しますが、出力を見たいだけの場合は問題ありません。

16
ghostdog74
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。

8
Robert Vila

たとえば、同じ行の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

ご覧のとおり、スペースがある場合でも給与明細は正しい行に表示されます。

7
Brother

次の行はどうですか:

awk '{$ 1 = $ 2 = $ 3 = ""; print} 'ファイル

@ ghostdog74の提案に基づきます。私はあなたが行をフィルタリングするとき、すなわち

awk '/ ^ exim4-config/{$ 1 = "";印刷} 'ファイル
5
Wawrzek

次の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
4
funk

まあ、正規表現を使用して同じ効果を簡単に達成できます。区切り文字がスペースであると仮定すると、次のようになります。

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
3
Eddie Sullivan

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

2
Chris Koknat
awk '{a=match($0, $3); print substr($0,a)}'

最初に、3列目の開始位置を見つけます。 substrを使用すると、位置(この場合はa)から行末までの行全体($ 0)を出力します。

2
Mitchjol

Bashでは、定位置パラメーターで次の構文を使用できます。

while read -a cols; do echo ${cols[@]:2}; done < file.txt

詳細: 位置パラメータの処理 Bash Hackers Wiki

1
kenorb
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

4番目のフィールドから最後のフィールドまで、元のファイルと同じ順序でレコードを出力します

1
Massimo

ここでは少し遅れていますが、上記のどれも機能していないようです。これを試して、printfを使用して、それぞれの間にスペースを挿入します。最後に改行を入れないことにしました。

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
1
Ross
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

最初の2列はクリアされ、sedは先頭のスペースを削除します。

0
sjas

最初の2つのフィールドを無視するだけで、それらのフィールドをマスクするときにスペースが必要ない場合(上記の回答の一部がそうであるように):

awk '{gsub($1" "$2" ",""); print;}' file
0
champost