2016-09-24 15 views
1

を加工した後、私は私のawkスクリプトによって処理された単純なファイル、持って行を印刷:AWK:彼らはすでに

AAAAA BBBBBB 
CCCCC DDDDDD 
EEEEE FFFFFF 
GGGGG HHHHHH 
IIIII JJJJJJ 

まず、私は最後の行の1をプリントアウトしたいので、私はで始まります結果としてIIIII JJJJJJを得ることができるように、

#!/usr/bin/awk 
{if (NR==5){print $0;}} 

を取得する。

ここで、5行目が印刷された後に2行目を印刷したいとします。だから私はこれにスクリプトを変更する:

#!/usr/bin/awk 
{if (NR==5){print $0; NR=2;} 
if (NR==2){print $0;} 

しかし、この場合、それは決して終わりのないループです。 5行目を最初に印刷し、2行目をもう一度印刷せずに2行目を印刷するにはどうすればよいですか?明確にするため

予想される出力:

IIIII JJJJJJ 
CCCCC DDDDDD 
+1

最終的なスクリプトでは決して終わりのないループです。 'NR = 2'を設定すると、awkは2行目の入力を読み直すように指示しません。次の行、6行目が読み込まれるまで変数' NR'を値 '2'に設定します。 'は' 6 'になります。またawkの 'condition {action}'の構文が欠落しています - awkはCではありません。Arnold RobbinsのEffective Awk Programming、第4版を読んでください。 –

答えて

5

これについてどのように:

awk '{if (NR==2){x=$0} else if (NR==5) {y=$0}} END {print y; print x}' input 

我々は、ファイルの行ごとのスキャンとして、我々はいくつかの変数でに興味のある行を格納し、最後に印刷します。

awk '{if (NR==2){x=$0} else if (NR==5) {print $0; print x}}' input 

変数にこれだけ保存するライン2:ここ

とは、わずかな単純な選択肢です。 5行目に達すると、それを印刷して、2行目を変数から出力します。

編集:ウィリアムPursellが指摘したように、上記のコードを書くためのより多くの慣用的な方法は、

awk 'NR==2 {x=$0} NR==5 {y=$0} END {print y; print x}' input 

と、入力ファイルを反転させることにより

awk 'NR==2 {x=$0} NR==5 {print $0; print x}' input 
+0

ああ、変数を使ってやったよ。それはそれをするだろう。ありがとう –

+1

awkを行うのにもっと慣用的です。NR == 2 {x = $ 0} NR == 5 {print $ 0; xを印刷する。 } ' –

+0

@WilliamPursellあなたが正しいです、私はOPが理解しやすい答えを提供しました。 – redneb

2

代替解決策になる(ライン賢明) ..入力ファイルの行数がわかるようにし、それに応じてNRを調整します。

$ tac ip.txt | awk 'NR==1 || NR==4' 
IIIII JJJJJJ 
CCCCC DDDDDD