2016-01-28 92 views
1

我使用下面的行分割和處理指定多個輸入文件一個班輪製表符分隔的.txt文件:對通過擴展

perl -lane 'next unless $. >30; @array = split /[:,\/]+/, $F[2]; print if $array[1]/$array[2] >0.5 && $array[4] >2' input.txt > output.txt 

有沒有辦法來改變這種單以便在多個輸入文件上執行此操作,而無需單獨指定每個文件?

理想的情況是在當前目錄中的所有文件執行其持有.TXT(或其他方式)的文件擴展名來完成 - 然後輸出一組修改過的文件的名稱,例如:

輸入:

test1.txt 
test2.txt 

輸出:

test1MOD.txt 
test2MOD.txt 

I K現在我可以訪問文件名以用$ARGV對其進行修改,但我不知道如何讓它在多個文件上運行。

perl -i.MOD -lane 'next unless $. >30; @array = split /[:,\/]+/, $F[2]; print if $array[1]/$array[2] >0.5 && $array[4] >2; close ARGV if eof;' *.txt 

$.需要被複位,否則由零誤差拋出一個除法。

+0

問題是 - '<>'被視爲單個文件句柄。如果您希望以單個流的形式循環播放整個文件,但它不會區分輸入文件。 – Sobrique

+0

@Sobrique那麼'<*.txt>'會批處理所有行同時丟失輸入文件信息? – AnnaSchumann

+0

編號'while while(<>)'which perl -n' which will will will。 – Sobrique

回答

1

如果你不介意稍微不同的輸出文件名,

perl -i.MOD -lane' 
    next unless $. >30; 
    @array = split /[:,\/]+/, $F[2]; 
    print if $array[1]/$array[2] >0.5 && $array[4] >2; 
    close ARGV if eof; # Reset $. for each file. 
' *.txt 
+0

這會產生一個錯誤,即在-e行1,<>行37864處被非法除零。但我不確定爲什麼 - 該行對所有單個文件無錯誤地運行。這種方法是跳過所有輸入文件的前30行還是隻跳過第一個輸入文件? – AnnaSchumann

+0

@AnnaSchumann這是你的所有代碼,你應該在分割之前用'eval {}'或者測試'$ array [2]!= 0'來捕獲異常。 –

+0

如果$ array [2] = 0'跳過該行,我嘗試了'next,但它仍然返回一個類似的錯誤。如果代碼在每個單獨的文件上運行,它可能是這種問題,而不是試圖使用多個文件的問題? – AnnaSchumann

1

你有沒有考慮從外殼for循環中調用Perl腳本?

for TXT in *.txt; do 
    OUT=$(basename $TXT .txt)MOD.txt 
    perl ... $TXT > $OUT 
done