これはシンプルで、短く、簡単に記述、理解、および確認できます。私は個人的に気に入っています。
grep -oE '\S+$' file
grep
Ubuntuでは、-E
または-P
で呼び出されると、空白文字(実際には通常はスペースまたはタブ)を意味し、そうでないものを意味するために省略形 \s
を取ります。使用数量詞と行末アンカーを、パターンは、行の末尾に1つ以上の非ブランクと一致します。の代わりに使用できます。この場合の意味は同じですが、異なる正規表現エンジンが使用されるため、パフォーマンス特性が異なる場合があります。\S
+
$
\S+$
-P
-E
これは、Avinash Rajのコメント付きソリューションと同等です(簡単でコンパクトな構文を使用するだけです)。
grep -o '[^[:space:]]\+$' file
これらのアプローチは、数字の後に末尾の空白がある可能性がある場合は機能しません。それらは変更することができますが、ここで説明する意味はありません。それはより多くのケースの下での作業に解決策を一般化するために、時には有益ですが1が通常知る方法がないので、それは、ほぼ同じ頻度の人々が想定する傾向があるので、そうすることは現実的ではありません多くの異なる互換性のない方法のどちらに問題が最終的に必要になることがありますが一般化されます。
パフォーマンスは重要な考慮事項である場合があります。この質問は、入力が非常に大きいことを規定するものではなく、ここに投稿されたすべてのメソッドが十分に高速である可能性があります。ただし、速度が必要な場合は、1,000万行の入力ファイルに関する小さなベンチマークを次に示します。
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
順序が重要な場合(I / Oが重いタスクの場合と同じように)、および結果を歪める可能性のある他の処理をバックグラウンドで実行していないマシンがなかったため、2回実行しました。これらの結果から、少なくとも暫定的に、使用したサイズの入力ファイルについて、以下を結論づけます。
うわー!渡す-P
(使用にPCRE)ではなく-G
(何も方言が指定されていないデフォルト)または-E
作られたgrep
桁を超えることにより、より速く。そのため、大きなファイルの場合、上記のコマンドよりもこのコマンドを使用した方がよい場合があります。
grep -oP '\S+$' file
ワオ!!cut
方法αғsнιηの答えは、より迅速な私の方法のさらに高速なバージョンよりも一桁を超えています!これはpa4080のベンチマークでも勝者であり、これはこれよりも多くのメソッドをカバーしましたが、入力は小さく、他のすべてのメソッドのうち、テストに含めるために選択しました。パフォーマンスが重要な場合やファイルが巨大な場合は、αғsнιηの方法を使用する必要があります。cut -d= -f2 file
cut
これはまた、リマインダとして機能シンプルcut
かつpaste
ユーティリティを忘れてはならない、と該当する場合、おそらく優先されなければならない、などのより高度なツールがあってもgrep
それは多くの場合、最初の行のソリューションとして提供されている(と私は個人的にもっと慣れていていること使用する)。
grep -o '[^[:space:]]\+$' file