Как я могу использовать awk для печати строки, только если ее правая половина строки _не совпадает с правой половиной предыдущей строки? - PullRequest
2 голосов
/ 30 октября 2010

У меня есть текст вроде:

[100 ps]  bar
[139 ps]  foo de fa fa
[145 ps]  foo de fa fa
[147 ps]  foo de fa fa
[149 ps]  le pamplemouse
[150 ps]  le pamplemouse
[177 ps]  le pomme de terre
[178 ps]  le pomme de terre

В awk я хочу отфильтровать все строки, где правая половина строки соответствует правой половине предыдущей строки. то есть строки uniquify, как будто нет метки времени. Так что я бы nix:

    [100 ps]  bar
    [139 ps]  foo de fa fa
    [145 ps]  foo de fa fa  <-- Nuked
    [147 ps]  foo de fa fa  <-- Nuked
    [149 ps]  le pamplemouse
    [150 ps]  le pamplemouse <-- Nuked
    [177 ps]  le pomme de terre 
    [178 ps]  le pomme de terre <-- Nuked</p>

Чтобы дать мне вывод:

    [100 ps]  bar
    [139 ps]  foo de fa fa
    [149 ps]  le pamplemouse
    [177 ps]  le pomme de terre

Как это можно сделать?

EDIT: Извините, я был не так ясен, как следовало бы. Левая половина строки - это отметка времени с постоянным количеством токенов, но в правой половине будет много токенов. В общем, я могу создать произвольные группировки памяти, такие как:

(regex1)(regex2)

Затем сравните $2, где $2 - это часть строки, которая соответствует regex2?

Ответы [ 4 ]

1 голос
/ 30 октября 2010
$ awk -F"][ \t]+" '!a[$2]++' file
[100 ps]  bar
[139 ps]  foo de fa fa
[149 ps]  le pamplemouse
[177 ps]  le pomme de terre
1 голос
/ 30 октября 2010

Бег на идеоне:

 BEGIN {prev=""}

 $3==prev {next}

{ prev = $3;
 print;}
1 голос
/ 30 октября 2010

что отделяет правую половину от левой? Это вкладка или несколько пробелов? Если это вкладка, то:

awk -F '\t' '
    $2 in seen {next} 
    { print; seen[$2]=1 }
'

Иначе я бы написал что-то вроде

perl -ane '
    $right_half = join " ", @F[2..-1];
    if (not $seen{$right_half}) {
        print;
        $seen{$right_half} = 1;
    }
'
1 голос
/ 30 октября 2010

Вы можете использовать ассоциативные массивы , чтобы поддерживать счетчик для каждой клавиши на правой стороне.

Это доказательство концепции лайнера, который вы можете использовать в качестве отправной точки

$ echo "[100 ps] bar\n[139 ps] foo\n[140 ps] foo" |
  awk '{count[$3]++; if (count[$3] == 1) print;}'
[100 ps] bar
[139 ps] foo

Это необходимо настроить, если правая строка может содержать пробелы.

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