The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
как сравнить второе поле разных строк, !*! nastr, 10-Июн-09, 11:31  [смотреть все]
Есть файл с примерно следующим содержанием:
    .  .     .  .  | 510,102,003 >MSISDN 380508647904 not found<
2009.06.10 04:42:56| 510,102,003 >MSISDN 380508647904 not found<
2009.06.09 15:30:59| 510,120,016 >ticket error: Problems in FETCH: <No statistics tickets from SMP <x1tmd> with SystemID <10> for 1800 seconds><"
2009.06.09 17:31:32| 510,120,016 >ticket error: Problems in FETCH: <No statistics tickets from SMP <x1tmd> with SystemID <10> for 1800 seconds><"
    .  .     .  .  | 904,114,002 >SXFW ,OTHER_ERROR:Couldn't get user data for login name XPRESS2 login type 0<
2009.06.10 05:09:31| 904,114,002 >SXFW ,OTHER_ERROR:Couldn't get user data for login name XPRESS2 login type 0<|catched in Login()

Хочу дописать shell скрипт для удаления повторяющиеся строк у которых поле даты пустое.
Алгоритм, на сколько я себе это представляю, должен быть примерно следующим:
if [ поле 1 строки 1 содержит "    .  .     .  .  " && поле 2 строки 1 == полю 2 строки 2 ]
then печатать строку 2

Не могу понять как это реализовать, думал может так
cat filename
if [ `awk -F"|" '{print $1}'` == "    .  .     .  .  " && `awk -F"|" '{print $2}'` == `awk -F"|" '{print $2}' sed -n '/`awk -F"|" '{print $2}'`/{n;p;}' ` ]
then
или так

cat filename | awk -F"|" '{
if ($1 == "    .  .     .  .  " && $2 == $2 следующей строки )
print $0
else
print $0
}

Подскажите пожалуйста как это лучше реализовать? самое не понятное для меня - как сравнить второе поле разных строк, на сколько я знаю awk обрабатывает файл построечно, то есть когда он обработывает вторую строку, он уже не помнит первую.

  • как сравнить второе поле разных строк, !*! Pahanivo, 12:47 , 10-Июн-09 (1)
    бред несеш

    grep выбери все строки с началом типа 2009.06.10 04:42:56|
    man grep , особое внимание там уделить regex

    • как сравнить второе поле разных строк, !*! nastr, 15:20 , 10-Июн-09 (2)
      >grep выбери все строки с началом типа 2009.06.10 04:42:56|
      >man grep , особое внимание там уделить regex

      Ну например:
      grep ^`date "+%Y"` filename
      grep '^    .  .     .  .  | ' filename
      Не совсем понимаю как провести сравнение, пожалуйста, можно пример?

      • как сравнить второе поле разных строк, !*! Pahanivo, 18:33 , 10-Июн-09 (3)
        >Ну например:
        >grep ^`date "+%Y"` filename

        вот это че за ахенея???
        тебе строки без даты убрать или с дато найти? или как???
        >grep '^    .  .    
        >.  .  | ' filename
        >Не совсем понимаю как провести сравнение, пожалуйста, можно пример?

        еще раз - man grep - смотрим что написано про regex (если слово "регекс" ниочем не говорит - то пример не поможет)

        ПРЕМЕР:
        выборка строк которые не начинаются датой фиксированного (твоего) формата:
        grep -v "^[[:digit:]]{4}\.[[:digit:]]{2}\.[[:digit:]]{2} ... далее додумай сам

        • как сравнить второе поле разных строк, !*! nastr, 15:42 , 11-Июн-09 (4)
          Возможно я не правельно сформулировал задачу, но по моему ни grep ни регулярные выражения мне не помогут.
          Задача следующая:
          if (поле 2 строки 1 = полю 2 строки 2)
          {
              if (поле 1 строки 1 = "    .  .     .  .  ")
              {
                  print строку 2
              }
              else
              {
                  print строку 1
              }
          }
          else
          {
          print строку 1
          }
          Я думаю нужно это реализовывать на awk, но я не могу разобраться с переходом со строки на строку..
          Вот примерная наброска (не работает):
          awk -F"|" '{
          a = $0;
          c = substr(a,1,19);        # $1 string a
          b = substr(a,index($0,"|")+1);    # $2 string a
          NR = NR++
          #getline
          if (b == $2) {
              if (c == "    .  .     .  .  ") {
                  print $0;
              }
              else {
                  print a;
              }
          }

          }' filename*

          • как сравнить второе поле разных строк, !*! phpcoder, 16:19 , 11-Июн-09 (5)
            >Я думаю нужно это реализовывать на awk, но я не могу разобраться
            >с переходом со строки на строку..

            Вам нужно всего лишь помнить предыдущую строку -- просто сохраните её в переменной (которую можно объявить в блоке BEGIN). И потом сравнивайте текущую, с сохранённой ранее.

            >Вот примерная наброска (не работает):
            >awk -F"|" '{
            >a = $0;
            >c = substr(a,1,19);  # $1 string a
            >b = substr(a,index($0,"|")+1); # $2 string a

            Используйте split()

            >NR = NR++

            Не думаю, что это хорошая идея, инкрементировать NR вручную, да и можно без этого обойтись.

            >[оверквотинг удален]
            > if (c == "    .  .  
            >   .  .  ") {
            >  print $0;
            > }
            > else {
            >  print a;
            > }
            >}
            >
            >}' filename*




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру