回答:
...またはより簡単な解決策:cut -f 3- INPUTFILE
正しい区切り文字(-d)を追加するだけで、同じ効果が得られます。
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
(printf
改行文字の中には印刷されませんprint ""
、他のフィールドが印刷された後に改行が追加されます)
echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
、これにより:3 4 5 6 7 8 9 10
。
awk '{ print substr($0, index($0,$3)) }'
解決策はここにあります:http :
//www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
Jonathan Feinbergの回答は、各フィールドを別々の行に出力します。を使用printf
して同じ行に出力用のレコードを再構築できますが、フィールドを左にジャンプして移動することもできます。
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
NF
。デクリメントはPOSIXでは許可されていません。
NF
は、デクリメントできるかどうかについては黙っています。
同じ行の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 -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
これは、指定されたフィールドnr。、Nの前にあるものを切り取り、フィールドnr.Nを含めて、行の残りのすべてを印刷し、元の間隔を維持します(再フォーマットしません)。フィールドの文字列が行の他の場所にも現れる場合は問題になりません。これは、daisaaの回答の問題です。
関数を定義します。
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つ。
次の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 }'
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
これにより、パターンが2倍になります。
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
Bashでは、位置パラメーターを使用して次の構文を使用できます。
while read -a cols; do echo ${cols[@]:2}; done < file.txt
追加情報:Bash Hackers Wikiでの位置パラメーターの処理
AWKでは列はフィールドと呼ばれるため、NFが重要です
すべての行:
awk -F '<column separator>' '{print $(NF-2)}' <filename>
最初の行のみ:
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>