用于从匹配行打印第一个字符串的Perl cmd选项

时间:2012-03-05 20:15:42

标签: perl

我有一个文本文件作为这样的输入:让它说为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

要求:我喜欢从包含SR“1”和TYPE为“Rx”的行中提取第一个数字字符串(TIME)

我几乎不懂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

帮助我......我需要做些什么改变,以便满足:

一个。只考虑Rx行中的“1”而不是xyz.txt文件中的No行。

湾删除output.txt

中除第一个字符串之外的所有字符串

4 个答案:

答案 0 :(得分:3)

$ perl -ane '{print "$F[0]\n" if $F[1] == 1 && $F[3] eq "Rx"}' xyz.txt 

2.050265
2.050887

答案 1 :(得分:1)

在正则表达式中使用分组来执行此操作:

perl -nle 'print $1, "\n" if /^([0-9\.]+) 1\s(.+?)Rx/' xyz.txt >>output.txt

答案 2 :(得分:1)

我会避免正则表达式难以维护。

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代码,作为下一个参数。

答案 3 :(得分:0)

perl -nle 'print $1 if m/^(\S+)\s1\s.*Rx/' xyz.txt >>output.txt