【发布时间】:2015-05-26 22:15:48
【问题描述】:
我希望遍历多个文件,以及文件中它们各自的行。我已经成功了。我现在想做的是根据其中一列中的数值删除文件中的行。
如果我有这样的输入:
XP.sta1 -41.5166 0.0513 0.6842 0.1794 0 CPHI.BHZ 300.2458 -42.2436
XP.sta2 3.5972 0.0500 0.7699 0.1213 0 E000.BHZ 300.5616 2.5545
XP.sta3 3.7112 0.0267 0.7813 0.1457 0 E002.BHZ 300.6140 2.6160
XP.sta4 4.2891 0.0214 0.6870 0.1308 0 E004.BHZ 301.2073 2.6006
第九列是我希望查看的列。我需要删除第 9 列中的该值(让我们为其分配一个变量 $time),如果 $time > 10 或小于 -10,则删除整行。到目前为止,我已经尝试过:
unless (($time < -10) || ($time > 10) {
print OUT2 ($stlat," ",$stlon," ",$eqlat," ",$eqlong," ",$eqdepth," ",$time,"\n");
}}
但是我得到以下输出:
XP.sta1 -41.5166 0.0513 0.6842 0.1794 0 CPHI.BHZ 300.2458 2.5545
XP.sta2 3.5972 0.0500 0.7699 0.1213 0 E000.BHZ 300.5616 2.6160
XP.sta3 3.7112 0.0267 0.7813 0.1457 0 E002.BHZ 300.6140 2.6006
XP.sta4 4.2891 0.0214 0.6870 0.1308 0 E004.BHZ 301.2073
如您所见,整行并没有被删除——只是满足真正的“除非”条件的值,然后其他值在第 9 列中向上移动。如何删除整行,而不仅仅是第九列号?
这里是我想编辑我的脚本的地方:
open(TABLEC,$File);
@tablec = <TABLEC>;
for ($j = 2; $j < $stop; $j++) {
chomp ($tablec[$j]);
($netSta,$delayTime) = (split /\s+/,$tablec[$j])[1,9] ;
}
在这个 for 循环中,我遍历每个文件,读取从 2 到 'stop' 的行,并切分返回字符。我将第 9 列设置为延迟时间变量。所以我循环遍历每一行,但我还不想打印任何东西(稍后在我的脚本中出现)。我只想删除整行,以便稍后在我的脚本中当我必须打印这些行时,第 9 列值为 >abs(10) 的行不存在。
【问题讨论】:
-
我们需要查看您的其余代码
-
如果范围的中点为 0,那么您可以使用
abs(正如 @Borodin 指出的那样),因此它可以短至perl -anE 'say if abs $F[8] <= 10 ;' datafile.txt。
标签: perl