行数が不明な詩があり、最後から2番目の詩だけを表示したいと思います。どのコマンドを使用すればよいですか?
これを行う方法はたくさんありますが、これは私が見つけた中で最速の方法であり、私の意見では最もクリーンです。
詩がpoem
という名前のファイルに記述されているとすると、次のように使用できます。
tail -n 2 poem | head -n 1
tail -n 2 poem
は、ファイルpoem
の最後の2行を書き込みます。
head -n 1
は、前のtail
コマンドによって提供された出力の最初の行を書き込みます。
エド、男を使用してください!
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
あなたがするだろう
sed '2q;d' <(tac infile)
tac
はinfile
とは逆の順序で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
詩がpoem
テキストドキュメントにあると仮定します。
< poem tail -n 2 | head -n 1
これは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