在扩展名指定的多个输入文件上执行一行

时间:2016-01-28 10:51:28

标签: perl

我使用以下行拆分和处理制表符分隔的.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

我知道我可以访问文件名以使用$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

$.需要重置,否则会抛出除零错误。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您是否考虑过从shell for循环调用perl脚本?

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