我使用以下行拆分和处理制表符分隔的.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
$.
需要重置,否则会抛出除零错误。
答案 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