web-dev-qa-db-ja.com

ファイルの最後の3列のみを印刷する

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列のみが出力されます。

3
Vivek Nigam
$ 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
4
Essex Boy

想定

  1. 区切り文字はスペースです
  2. 最初の列以外はすべて必要です。これは空白でもかまいませんが、区切り文字が含まれます
  3. 列間には区切り文字が1つしかありません

次に、cut -d' ' -f2-スペースで区切られた値ファイルから、2番目の列から最後の列までの内容を印刷します。

7
CSM

これはまったく正しくありません。$NF-1は、最後の列の値から1を引いた値を出力します。 NFは変数なので、(..)内でコマンドをグループ化する必要があります

gawk 'NF>=3{ print $(NF-2), $(NF-1), $NF}' file

NF>=3の部分は、少なくとも3つのフィールドがあることが保証されている行の最後の3つのフィールドを印刷していることを安全に検証するためのものです。

6
Inian

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"
3

私は以下のコマンドでテストしましたが、うまくいきました

 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
2

質問には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を引いたものを与えます

0
Sundeep

awk '{print $(NF-2),$(NF-1),$(NF)}' file.txt

ここで、NFはファイル内のフィールドの数です。

0
Death Metal