
たとえば、私のファイルは次のようになります。
59 6 18 2014 169 7 14 2 7671912 7849744 201 4
60 6 19 2014 170 5 49 2 7671912 7849744 201 5
61 6 20 2014 171 6 8 2 7671912 7849744 201 6
62 6 23 2014 174 5 3 2 7671912 7849744 201 7
63 6 23 2014 174 7 17 2 7671912 7849744 201 8
64 6 24 2014 175 16 13 2 7671912 7849744 201 9
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
10
1 1 49 6 16 2014 7 39 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 2 49 6 17 2014 13 15 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 3 49 6 18 2014 1 38 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 4 49 6 18 2014 7 14 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 5 49 6 19 2014 5 49 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
単一のトークン項目「10」の前の行を印刷する必要があります。
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
どうすればいいですか?
答え1
あなたはそれを使用することができますawk
:
awk 'NF == 1 { print LAST } { LAST=$0 }' < datafile
これはLAST=$0
ファイルの各行()を保存し、行にレコードが1つしかない場合(NF == 1
-- ほぼNF
その行のトークン数)、以前に保存された行を印刷します。
答え2
タグが1回しか表示されない場合は、GNUを使用して次のことができますgrep
。head
grep -x -B 1 10 file | head -n 1
一致する行とその前の行を印刷するように指示します-B 1
。grep
この-x
オプションを使用すると、実際の行grep 10
と一致します(代わりにx
10
含む 10
)。最後に、head -n 1
結果行の最初の行だけが印刷されます。
答え3
sed
あなたはそれを使用することができますsed
:
sed -e '/^10$/{x;p;}' -e 'x;d' < datafile
説明する:
このアドレスは/^10$/
10を含む行と一致します。一致が発生すると、次の一連のコマンドが実行され、予約済みスペースをパターンスペースに交換()してから、パターンスペースを印刷({x;p;}
)します。x
p
前の行を含めるために、スクリプトの残りの部分のためにスペースが予約されています。ファイルの各行にx
予約されたスペースがパターンスペースに置き換えられ()、パターンスペースd
のすべての内容が削除()されます。
10行目を表示するときにのみ一致させるアドレスプレフィックスを持つ最初のコマンドとは異なり、このコマンドにはプレフィックスがないため、ファイル内のすべての行と一致します。最終結果は、私たちが見る最後の行を予約された空間に入れ続けることであり、パターン空間を取り除くことは、私たちが10を見るときに明示的な出力以外に出力がないことを意味します。