Я хочу перебрать несколько файлов и их соответствующие строки в файле. Я уже успешно это сделал. Хотелось бы, чтобы я теперь хотел удалить строки в файле на основе числового значения в одном из столбцов.Удалить строку из файла на основе значения столбца в Perl
Если у меня вход, такие как это:
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), в том случае, если это время $> 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] ;
}
В этом цикл, я пробегаем по каждому файлу, чтение в линии от 2-х до «остановки», и chopming возвратного характера. Я установил 9-й столбец в переменную времени задержки. Поэтому я перебираю каждую строку, но я не хочу ничего печатать (это происходит позже в моем скрипте). Я просто хотел бы удалить эту целую строку, так что позже в моем скрипте, когда мне придется печатать строки, строка, где значения девятого столбца> abs (10) не существует.
Мы должны увидеть остальную часть вашего кода – Borodin
Если диапазон имеет 0 в качестве средней точки, то вы можете использовать 'abs' (как @Borodin указывает), так что может быть коротким, как 'perl -anE 'сказать, если abs $ F [8] <= 10;' datafile.txt'. –