web-dev-qa-db-ja.com

テキストの最後から2番目(最後から2番目)の行のみを表示する

行数が不明な詩があり、最後から2番目の詩だけを表示したいと思います。どのコマンドを使用すればよいですか?

7
Elena

これを行う方法はたくさんありますが、これは私が見つけた中で最速の方法であり、私の意見では最もクリーンです。

詩がpoemという名前のファイルに記述されているとすると、次のように使用できます。

tail -n 2 poem | head -n 1

tail -n 2 poemは、ファイルpoemの最後の2行を書き込みます。

head -n 1は、前のtailコマンドによって提供された出力の最初の行を書き込みます。

19
Iskustvo

エド、男を使用してください!

ed -s poems <<< $'$-1\n'

これにより、edはpoemsファイルをスクリプトモード(-s)(余分なメッセージを表示しないようにするため)、「ファイルの最後の行に移動する($)、マイナス1 "、その行を出力します。

入力された詩ファイルが与えられた場合 of

A is for awk, which runs like a snail, and
B is for biff, which reads all your mail.

C is for cc, as hackers recall, while
D is for dd, the command that does all.

E is for emacs, which rebinds your keys, and
F is for fsck, which rebuilds your trees.

G is for grep, a clever detective, while
H is for halt, which may seem defective.

I is for indent, which rarely amuses, and
J is for join, which nobody uses.

K is for kill, which makes you the boss, while
L is for Lex, which is missing from DOS.

M is for more, from which Less was begot, and
N is for Nice, which it really is not.

O is for od, which prints out things Nice, while
P is for passwd, which reads in strings twice.

Q is for quota, a Berkeley-type fable, and
R is for ranlib, for sorting ar sic table.

S is for spell, which attempts to belittle, while
T is for true, which does very little.

U is for uniq, which is used after Sort, and
V is for vi, which is hard to abort.

W is for whoami, which tells you your name, while
X is, well, X, of dubious fame.

Y is for yes, which makes an impression, and
Z is for zcat, which handles compression.

...結果の出力は次のとおりです。

Y is for yes, which makes an impression, and
6
Jeff Schaller

あなたがするだろう

sed '2q;d' <(tac infile)

tacinfileとは逆の順序でcatファイルを逆順に印刷し、sedへの入力として渡します。これにより、 2番目とすぐに終了します。

または代わりに:

tail -n2 infile | sed '2d'

またはsedのみ

sed 'x;$!d' <infile

sedは一度に1行を読み取っており、ホールドスペースxを指定すると、現在の行の処理を保存して出力します!d(削除しないでください)1度sedすべての行を読み取る(または最後の行にある)そしてsedが保持できるスペースは1つだけなので、それが最後の行になるとホールドスペースには2番目の最後の行が含まれます。これは次と同じです:

sed -n 'x;$p' <infile
5
αғsнιη

詩がpoemテキストドキュメントにあると仮定します。

< poem tail -n 2 | head -n 1
3
emmrk

awk

これはGNU awk(Linux)およびBSD awk(Mac)で動作します。

空白行を無視することもできます。その場合、awk 'NF' file.txt、次にこのページで説明する他の方法のいずれかを介して出力をパイプ処理します。

また、awkのすべてを一度に実行することもできます。

awk 'NF { a=b ; b=$0 } END { print a }' file.txt
  • NF
    データを含むプロセス行のみ。 NFは行のフィールド数を表します。 0より大きい値は「true」として扱われます。
    • { a=b ; b=$0 }
      現在の非空白行をbとして保存し、前の非空白行をaとして保存します。
  • END { print a }
    ファイル全体を調べた後、a(最後から2番目の空白でない行)の最終値を出力します。

空白行を省略したくない場合は、NFを削除するだけです。

awk '{ a=b ; b=$0 } END { print a }' file.txt
1
Gaultheria