Параметр Perl cmd для печати первой строки из совпавшей строки - PullRequest
1 голос
/ 06 марта 2012

У меня есть текстовый файл в качестве ввода: скажем, xyz.txt

TIME    SR No               TYPE DATA

2.046103 1  1               Tx   d 8 01 01 01 99 9A 9B 9C 9D
2.046163 3  1               Rx   d 8 01 01 01 99 9A 9B 9C 9D
2.046361 2  1               Rx   d 8 01 01 01 99 9A 9B 9C 9D
2.046916 1  3               Tx   d 8 01 01 01 9B 9C 9D 9E 9F
2.046977 3  3               Rx   d 8 01 01 01 9B 9C 9D 9E 9F
2.047177 2  3               Rx   d 8 01 01 01 9B 9C 9D 9E 9F
2.048034 1  5               Tx   d 8 01 01 01 AD AE AF B0 B1
2.048095 3  5               Rx   d 8 01 01 01 AD AE AF B0 B1
2.048295 2  5               Rx   d 8 01 01 01 AD AE AF B0 B1
2.050006 1  8               Tx   d 8 01 01 01 B1 B2 B3 B4 B5
2.050065 3  8               Rx   d 8 01 01 01 B1 B2 B3 B4 B5
2.050265 1  8               Rx   d 8 01 01 01 B1 B2 B3 B4 B5
2.050632 2  601             Rx   d 8 01 01 01 CA CB CC CD CE
2.050690 3  700             Rx   d 8 01 01 01 CA CB CC CD CE
2.050887 1  700             Rx   d 8 01 01 01 CA CB CC CD CE

Требование: мне нравится извлекать первые числовые строки (TIME) из строк, которые содержат SR "1" и TYPE как "Rx"

Я почти не знаю Perl и попробовал команду, прочитав в интернете, т.е.:

perl -nle "print if /"1"\s(.+?)"Rx"/" xyz.txt >>output.txt

для извлечения совпавших строк

Вывод, который я получил в output.txt:

2.046163 3  1               Rx   d 8 01 01 01 99 9A 9B 9C 9D
2.046361 2  1               Rx   d 8 01 01 01 99 9A 9B 9C 9D
2.050265 1  8               Rx   d 8 01 01 01 B1 B2 B3 B4 B5
2.050632 2  601             Rx   d 8 01 01 01 CA CB CC CD CE
2.050887 1  700             Rx   d 8 01 01 01 CA CB CC CD CE

Желаемый вывод (Требование) - только эти:

2.050265              
2.050887 

Полная информация о двух вышеуказанных значениях взята из xyz.txt:

2.050265 1  8               Rx   d 8 01 01 01 B1 B2 B3 B4 B5
2.050887 1  700             Rx   d 8 01 01 01 CA CB CC CD CE

помогите мне .... какие изменения мне нужно сделать, чтобы это удовлетворило:

а. учитывайте только «1» из строки Rx, а не из строки «No» в файле xyz.txt.

б. Удалить все, кроме первой строки в output.txt

Ответы [ 4 ]

3 голосов
/ 06 марта 2012
$ perl -ane '{print "$F[0]\n" if $F[1] == 1 && $F[3] eq "Rx"}' xyz.txt 

2.050265
2.050887
1 голос
/ 06 марта 2012

Я бы не использовал регулярные выражения, поскольку их трудно поддерживать.

perl -lne '@a=split; print "$a[0]" if (($a[1] == 1) and ($a[3] eq "Rx"))'

Объяснение:

  • split - разбивает вашу строку на токены, разделенные пробелами.
  • print "$ a [0]" - печатает первый токен
  • $ a [1] == 1 - оценивает, если второй токен численно оценивается как 1
  • $ a [3] eq "Rx" - оценивает, равен ли 4-й токен строке Rx.

Кроме того, переключатели командной строки:

  • -l вызывает perl для обработки строканалогично awk / sed (игнорирует начальные / конечные пробелы)
  • -n заставляет perl применять программу perl к каждой строке ввода
  • -e предоставляет код perl для выполнения в командной строке, как следующий аргумент.
1 голос
/ 06 марта 2012

Используйте группировки в регулярном выражении, чтобы сделать это:

perl -nle 'print $1, "\n" if /^([0-9\.]+) 1\s(.+?)Rx/' xyz.txt >>output.txt
0 голосов
/ 06 марта 2012
perl -nle 'print $1 if m/^(\S+)\s1\s.*Rx/' xyz.txt >>output.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...