Perl cmd选项,用于从匹配行打印第一个字符串
我有一个文本文件作为输入,比如说xyz.txtPerl cmd选项,用于从匹配行打印第一个字符串,perl,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.04
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”并键入“Rx”的行中提取第一个数字字符串(时间)
我几乎不懂perl,通过在internet上阅读尝试了一个命令,即:
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
帮助我…我需要做哪些更改,以满足:
a。从XX行中只考虑“1”,而不考虑XYZ.TXT文件中的“无行”。
b。删除output.txt中除第一个字符串以外的所有字符串使用正则表达式中的分组执行此操作:
perl -nle 'print $1, "\n" if /^([0-9\.]+) 1\s(.+?)Rx/' xyz.txt >>output.txt
在正则表达式中使用分组可以执行以下操作:
perl -nle 'print $1, "\n" if /^([0-9\.]+) 1\s(.+?)Rx/' xyz.txt >>output.txt
我会避免正则表达式,因为它很难维护
perl -lne '@a=split; print "$a[0]" if (($a[1] == 1) and ($a[3] eq "Rx"))'
说明:
- 拆分——将行拆分为标记,用空格分隔
- 打印“$a[0]”——打印第一个令牌
- $a[1]==1——如果第二个令牌的数值计算结果为1,则进行计算
- $a[3]eq“Rx”--计算第四个令牌是否等于字符串Rx
- -l使perl处理类似于awk/sed的行(忽略前导/尾随空格)
- -n使perl将perl程序应用于每一行输入
- -e提供要在命令行上执行的perl代码,作为下一个参数
perl -lne '@a=split; print "$a[0]" if (($a[1] == 1) and ($a[3] eq "Rx"))'
说明:
- 拆分——将行拆分为标记,用空格分隔
- 打印“$a[0]”——打印第一个令牌
- $a[1]==1——如果第二个令牌的数值计算结果为1,则进行计算
- $a[3]eq“Rx”--计算第四个令牌是否等于字符串Rx
- -l使perl处理类似于awk/sed的行(忽略前导/尾随空格)
- -n使perl将perl程序应用于每一行输入
- -e提供要在命令行上执行的perl代码,作为下一个参数
-a
为您执行拆分的示例,您可以看到我的答案,您不需要拆分为一行程序。您可以看到我的答案,例如使用-a
为您执行拆分,方法是:perl-ane'{print“$F[0]\n”if$F[1]==1&&$F[3]eq“Rx”}'xyz.txt,正如您所说的那样,在-e行1的EOF之前的任何位置都找不到字符串终止符“”。我将它改为perl-ane“{print”$F[0]\n”if$F[1]==1&&$F[3]eq“Rx”}”xyz.txt,因为在windows上使用它显示:在-e行1附近的“]\”(在\?之前缺少运算符)处发现运算符,在-e行1附近的语法错误,在“]\”处由于编译错误而中止了-e的执行。我是否必须为它编写一个.plx/.pl脚本,就像您为F[0]和F[3]数组标注尺寸一样???@user1117568-这是因为在Windows上,您不能像在Unix上那样使用撇号(单引号)作为引号字符。这不是Perl的东西,而是操作系统的东西。如果您想这样做,您需要使用双引号,然后转义代码中的所有双引号(例如,\“$F[0]\n\”
)@user1117568-不,使用-a
为您创建@F数组,这就是美妙之处。如果您想使用Perl一行程序,您应该阅读effectively@user1117568-通过接受您认为有用的答案(答案旁边的复选标记:)并发出:perl-ane'{print“$F[0]\n”if$F[1]==1&&$F[3]eq“Rx”}'xyz.txt,您可以用通常的方式表达您的感激之情在EOF之前的任何地方-e线1。我将它改为perl-ane“{print”$F[0]\n”if$F[1]==1&&$F[3]eq“Rx”}”xyz.txt,因为在windows上使用它显示:在-e行1附近的“]\”(在\?之前缺少运算符)处发现运算符,在-e行1附近的语法错误,在“]\”处由于编译错误而中止了-e的执行。我是否必须为它编写一个.plx/.pl脚本,就像您为F[0]和F[3]数组标注尺寸一样???@user1117568-这是因为在Windows上,您不能像在Unix上那样使用撇号(单引号)作为引号字符。这不是Perl的东西,而是操作系统的东西。如果您想这样做,您需要使用双引号,然后转义代码中的所有双引号(例如,\“$F[0]\n\”
)@user1117568-不,使用-a
为您创建@F数组,这就是美妙之处。如果您想使用Perl一行程序,您应该阅读effectively@user1117568-通过接受您认为有用的答案(答案旁边的复选标记:),以通常的方式表达您的感激之情