Удалить строки в текстовом файле (Звонки) - PullRequest
0 голосов
/ 31 января 2012

Это время вызовов, поэтому ожидается, что любой вызов занимает более 2 секунд или менее 0,5 секунд (в основном это между 0,800 или 1,900 макс.) У меня проблема при попытке найти скрипт для удаления некоторых строк, вотпример:

06:28:30.259    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error
06:28:54.191    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:28:55.596    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error
06:29:19.251    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:29:20.042    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:29:20.566    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error
06:29:42.900    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:29:44.268    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error
06:30:08.146    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:30:09.530    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error
06:30:31.925    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:30:33.228    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error
06:30:56.178    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error

Цель состоит в том, чтобы получить этот результат:

06:28:54.191    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:28:55.596    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error
06:29:19.251    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:29:20.566    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error
06:29:42.900    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:29:44.268    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error
06:30:08.146    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:30:09.530    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error
06:30:31.925    qchatmgr_pal.c  197     E       +++PTT Press    Call Manager/Error
06:30:33.228    *InCallForm.c   934     E       FloorStatus: Granted    Legacy/Error

Комментарии:

Первое сообщение должно быть всегда "+++ PTT Press" ипоследняя строка должна быть "FloorStatus: Granted". Строка 5 должна быть удалена, поскольку она не имеет смысла; настройка вызова должна быть (на самом деле) от 0,800 мс до 1,9 с, поэтому менее 0,5 мсек не настолько реалистична, чтобы строка былаудалено.

Может кто-нибудь дать мне несколько советов, пожалуйста, чтобы двигаться вперед, я не ожидаю, что кто-то решит это, потому что это немного сложно.Я работал с некоторыми другими скриптами (bash), которые я нашел здесь на этом сайте, но они не подходят для этого.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Это немного уродливо (может быть, вы хотите использовать awk или perl):

#!/bin/bash
FILE=calls.txt

## remove first line if it contains "Granted"/last line "+++PTT"
head -n 1 ${FILE} | grep -q Granted && sed -i '1d' ${FILE}
tail -n 1 ${FILE} | grep -q +++PTT && sed -i '$d' ${FILE}

## remove duplicated Granted entries
tac ${FILE} > ${FILE}.tac
sed -i '$!N; /^.*\(FloorStatus\).*\n.*\1.*$/!P; D' ${FILE}.tac
tac ${FILE}.tac > ${FILE}

LASTTIME=0

while read line ; do
  ## is line empty?
  if [ ! -z "${line}" ] ; then

    ## fetch times
    T=$(echo ${line} | cut -d " " -f 1)
    echo ${line} | grep -q +++PTT
    P=$?
    echo ${line} | grep -q Granted
    G=$?

    ## create timestamp
    #TSTAMP=$(date -d "${T}" +'%s%N')
    H=$(expr $(echo ${T} | cut -d : -f 1) \* 3600)
    M=$(expr $(echo ${T} | cut -d : -f 2) \* 60)
    S=$(echo ${T} | cut -d : -f 3 | sed 's#\.##g')
    TSTAMP=$(expr ${H} \+ ${M})
    TSTAMP=$(expr ${TSTAMP} \+ ${S})

    ## calculate diff
    D=$(expr ${TSTAMP} \- ${LASTTIME})

    ## less than threshold?
    #if [ ${D} -lt 800000000 ] ; then
    if [ ${D} -lt 800 -a ${P} -ne 0 ] ; then
      ## remove current call
      sed -i '/^'${T}'/d' ${FILE}
    fi
    LASTTIME=${TSTAMP}
  fi
done < ${FILE}

## remove duplicated +++PTT entries
tac ${FILE} > ${FILE}.tac
sed -i '$!N; /^.*\(+++PTT\).*\n.*\1.*$/!P; D' ${FILE}.tac
tac ${FILE}.tac > ${FILE}
0 голосов
/ 01 февраля 2012

Вы можете использовать код, подобный этому:

    while read FirstField SecondField ThirdField ForthFiled FifthField SeventhField
    do
    #you have your Values of a line in this seven variables

    done < yourfilename

этот файл будет читать все ваши файлы и сохранять значения времени в FirstField, а во втором поле, например * InCallForm.c, в SecondField и т. Д. так что вы можете делать все с вашим файлом в этом цикле while. если ты не понял, я могу рассказать больше ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...