Linuxにこのファイルがあります。
14:00:01.071 5255 604177
4 14:00:01.074 4608 1415742
14:00:01.074 18398 1122001
2 14:00:01.074 11723 155575
5 14:00:01.075 4695 885808
望ましい出力:
14:00:01.071 5255 604177
14:00:01.074 4608 1415742
14:00:01.074 18398 1122001
14:00:01.074 11723 155575
14:00:01.075 4695 885808
使用するコマンド:
gawk '{ print $NF-1, $NF}' filename
ただし、最後の2列のみが出力されます。
$ awk '{ print $(NF-2), $(NF-1), $NF}' file1
14:00:01.071 5255 604177
14:00:01.074 4608 1415742
14:00:01.074 18398 1122001
14:00:01.074 11723 155575
14:00:01.075 4695 885808
想定
次に、cut -d' ' -f2-
スペースで区切られた値ファイルから、2番目の列から最後の列までの内容を印刷します。
これはまったく正しくありません。$NF-1
は、最後の列の値から1を引いた値を出力します。 NF
は変数なので、(..)
内でコマンドをグループ化する必要があります
gawk 'NF>=3{ print $(NF-2), $(NF-1), $NF}' file
NF>=3
の部分は、少なくとも3つのフィールドがあることが保証されている行の最後の3つのフィールドを印刷していることを安全に検証するためのものです。
GNU grep
を使用すると、次のことができます。
grep -Eo '\S+\s+\S+\s+\S+\s*$'
これにより、入力の間隔が保持されます。 3つ未満のフィールドを含む行はスキップされることに注意してください。
POSIXlyの場合、同等のものは次のようになります。
S='[^[:space:]]\{1,\}' s='[[:space:]]\{1,\}'
sed -n "s/$S$s$S$s${S}[[:space:]]*$/\\
&/;s/.*\n//p"
私は以下のコマンドでテストしましたが、うまくいきました
sed "s/^[0-9]\{1,\}//g" filename| sed -r "s/^\s+//g"
出力
14:00:01.071 5255 604177
14:00:01.074 4608 1415742
14:00:01.074 18398 1122001
14:00:01.074 11723 155575
14:00:01.075 4695 885808
質問にはPerl
がタグ付けされているので
$ Perl -lane 'print "@F[-3..-1]"' ip.txt
14:00:01.071 5255 604177
14:00:01.074 4608 1415742
14:00:01.074 18398 1122001
14:00:01.074 11723 155575
14:00:01.075 4695 885808
-l
入力行から改行を取り除き、print
が使用されている場合は文字列の最後に追加します-a
配列を介してアクセス可能な空白に基づく@F
自動分割入力print "@F[-3..-1]"
目的のフィールドを出力します。配列を二重引用符で囲んで指定した場合のデフォルトの区切り文字は単一のスペースです。-1
は最後のフィールドを参照し、-2
は最後の2番目のフィールドを参照する、など..
は範囲演算子ですフィールドが3つ未満の行を表示したくない場合は、Perl -lane 'print "@F[-3..-1]" if $#F > 2'
を使用します。 $#F
は、配列の最後のインデックス、つまり配列のサイズから1を引いたものを与えます
awk '{print $(NF-2),$(NF-1),$(NF)}' file.txt
ここで、NFはファイル内のフィールドの数です。