Как прочитать файл построчно и распечатать предыдущую строку, где файл содержит один токен

Как прочитать файл построчно и распечатать предыдущую строку, где файл содержит один токен

Например, мой файл выглядит так:

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) по мере ее поступления, и когда в строке есть только одна запись ( NF == 1- NFэто количество токенов в строке, грубо говоря), он выводит сохраненную предыдущую строку.

решение2

Если у вас есть только одно вхождение токена, вы можете сделать это с помощью 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 -e '/^10$/{x;p;}' -e 'x;d' < datafile

Объяснение:

Адрес /^10$/соответствует строке, содержащей 10. При совпадении выполняется следующая серия команд, {x;p;}которая обменивает ( x) пространство удержания с пространством шаблона, а затем печатает ( p) пространство шаблона.

Пространство удержания содержит предыдущую строку из-за остальной части скрипта. Для каждой строки файла поменяйте ( x) пространство удержания на пространство шаблона, а затем удалите ( d) все, что находится в пространстве шаблона.

В отличие от первой команды, которая имеет префикс адреса, который заставляет ее сопоставляться только тогда, когда видна строка 10, эти команды не имеют префикса и, таким образом, сопоставляются на каждой строке файла. Конечный результат заключается в том, что мы продолжаем помещать последнюю увиденную строку в пространство удержания, а тот факт, что мы удаляем пространство шаблона, означает, что нет никакого вывода, кроме нашего явного вывода, когда мы видим 10.

Связанный контент