с использованием sed in loop

У меня есть файлы .txt со следующей структурой:

20170515000650883,208,-32,-896,stand
20170515000651883,336,96,-928,stand
20170515000652982,368,64,-896,stand
20170515000653982,256,-48,-816,lie
20170515000654982,368,48,-832,lie
20170515000655982,15081,32,-688,lie
20170515000656982,15081,48,-864,lie
20170515000657983,15081,112,-1072,lie
20170515000658983,15081,-32,-992,lie
20170515000659983,15081,-48,-1072,lie
20170515000700983,15081,-32,-880,lie
20170515000701983,15081,16,-832,stand
20170515000702983,15081,-48,-720,stand
20170515000703983,15081,0,-896,stand
20170515000704983,15081,112,-880,lie
20170515000705983,15081,-48,-1072,lie
...

Моя цель - найти события ложь , представленные в последнем столбце. Я понял это с помощью

sed -n '13,$s/lie/&/p' $subj > $SUBJECTS_DIR/temp.txt

, где я начал поиск со строки 13 и сохранил все строки с 'ложью' в свой временный файл. Но можно ли собирать данные во время выполнения sed-команды? Первый столбец содержит метку времени: поэтому, когда lie = TRUE, я хочу получить значение из column_1; также, когда встречается последняя ложь в этой последовательности (всего 8 'ложь', соответствующее значение столбца_1 необходимо для вычисления разницы во времени. Поиск следует продолжать до тех пор, пока файл не закончится. Кто-нибудь знает, как собрать эту информацию во время sed?

0
13.07.2017, 14:20
3 ответа

Для этого можно использовать awk.

awk -F"," '/lie/{a[++i>2?2:i]=$1}END{print a[2] - a[1] }' input.txt

Команда awk сохранит в массиве первую и самую последнюю метку времени, которая соответствует «лежи». Как только файл будет прочитан, awk вычтет первое совпадение из последнего совпадения.

0
28.01.2020, 04:43

Мне непонятно, что такое "разница во времени", но первую колонку с "ложью" можно просто расширить этой командой:

cat data.txt | grep lie | sed "s/,.*,lie//g"

grepотбрасывает все строки без «ложи», а sedудаляет все, кроме первого столбца.

Тогда вы можете f.e. преобразовать его в массив и работать с нужными числами в bash

0
28.01.2020, 04:43

Вероятно, слишком поздно публиковать это:

sed  -nE '13,$ s/([^,]*).*lie$/\1/p' in.txt

Где:

  • -nE:

    • -n для --без звука, --без звука :без автоматической печати пространства шаблона.
    • -Eдля --регулярное выражение -расширенное :использовать расширенные регулярные выражения
  • ([^,]*):фиксирует метку времени

  • .*lie$:гарантирует, что строка заканчивается «ложью».

Так:временные метки для «лжи», начиная со строки 13, будут возвращены

0
18.11.2021, 08:45

Теги

Похожие вопросы