У меня есть файлы .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?
Для этого можно использовать awk.
awk -F"," '/lie/{a[++i>2?2:i]=$1}END{print a[2] - a[1] }' input.txt
Команда awk сохранит в массиве первую и самую последнюю метку времени, которая соответствует «лежи». Как только файл будет прочитан, awk вычтет первое совпадение из последнего совпадения.
Мне непонятно, что такое "разница во времени", но первую колонку с "ложью" можно просто расширить этой командой:
cat data.txt | grep lie | sed "s/,.*,lie//g"
grep
отбрасывает все строки без «ложи», а sed
удаляет все, кроме первого столбца.
Тогда вы можете f.e. преобразовать его в массив и работать с нужными числами в bash
Вероятно, слишком поздно публиковать это:
sed -nE '13,$ s/([^,]*).*lie$/\1/p' in.txt
Где:
-nE
:
-E
для --регулярное выражение -расширенное :использовать расширенные регулярные выражения([^,]*)
:фиксирует метку времени
.*lie$
:гарантирует, что строка заканчивается «ложью».
Так:временные метки для «лжи», начиная со строки 13, будут возвращены