ファイルを1行ずつ読み取り、ファイルに1つのトークンが含まれている前の行を出力する方法

ファイルを1行ずつ読み取り、ファイルに1つのトークンが含まれている前の行を出力する方法

たとえば、私のファイルは次のようになります:

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 を使用して次のように実行できますgrephead

grep -x -B 1 10 file | head -n 1

は、一致する行とその前の行を印刷するように-B 1指示します。オプションを使用すると、一致する行とまったく同じ行に一致します(grep-xgrep 10x10含む 10)。最後に、head -n 1結果の行の最初の行のみを出力します。

答え3

sed

以下を使用できますsed:

sed -e '/^10$/{x;p;}' -e 'x;d' < datafile

説明:

アドレスは/^10$/10 を含む行と一致します。一致すると、次の一連のコマンドが実行され、ホールド スペースとパターン スペース{x;p;}が交換され ( )、パターン スペースが印刷されます ( )。xp

ホールド スペースには、スクリプトの残りの部分があるため、前の行が含まれています。ファイルの各行について、xホールド スペースをパターン スペースと交換 ( ) し、dパターン スペースにあるものをすべて削除 ( ) します。

アドレス プレフィックスを持つ最初のコマンドとは異なり、これらのコマンドにはプレフィックスがないため、ファイルのすべての行に一致します。最終的な結果は、最後に見た行をホールド スペースに置き続けることになり、パターン スペースを削除するということは、10 を見たときに明示的な出力以外の出力がないことを意味します。

関連情報