【问题标题】:Perl: open files from one folder and saved the edited files in another folder [closed]Perl:从一个文件夹打开文件并将编辑的文件保存在另一个文件夹中[关闭]
【发布时间】:2014-02-18 09:01:47
【问题描述】:

我有一个名为“input”的文件夹和一个名为“output”的文件夹。在“输入”中,我有几个 .txt 文件。我需要一个 perl 脚本来读取这些文件,编辑它们(删除前 10 行)并将新的 .txt 文件保存在“输出”文件夹中。用 perl 可以做到吗?

谢谢

【问题讨论】:

  • 是的,这是可能的。开始黑客攻击,在出现问题时返回您的代码,您将获得帮助。
  • 更好的是,不要开始黑客攻击。开始设计一种算法,如果您在设计上遇到困难,请回来并说明您卡在哪里。
  • 我在 Perl 中需要它...这是我的尝试,但它不起作用:opendir(IN,"input") || die "无法打开输入文件"; opendir(OUT,"输出") || die "无法打开输出文件"; while() { 打印除非 1 .. 10; } 逼近);关闭(OUT);

标签: perl file directory


【解决方案1】:
#!/usr/bin/perl -w
use strict;
use warnings;

opendir IN, 'input';
my @in = grep { /^[^.]/ } readdir IN; # read all file names form dir except names started with dot
closedir IN;

for my $in (@in) {
  open IN, '<', "input/$in" || next;
  open OUT, '>', "output/$in" || die "can't open file output/$in";
  while(<IN>) { #read file line by line
    print OUT $_ if $. > 10; #print the last line $_ to the file if line number $. is bigger than 10 
  }
  close OUT;
  close IN;
}

【讨论】:

  • 非常感谢,亚历克斯。它完美地工作。如果您向我解释此脚本背后的逻辑以供将来学习,那就太过分了?
  • @user3240622 我已将 cmets 添加到代码中
【解决方案2】:

为什么要使用 Perl?

tail -n +N 会输出一个从 N 行开始的文件,所以如果你想删除前 10 行可以使用tail -n +11 file &gt; new_file

要自动处理文件夹中的所有文件,这个 bash one-liner 怎么样:

for i in input/*.txt; do e=`basename $i`; tail -n +11 $i > output/${e}; done

编辑:使用现代符号tail -n +N 而不是旧的deprecated syntax

【讨论】:

  • 并非所有系统都有basename,首选:cd input; for i in *.txt; do tail -n +11 "$i" &gt; ../output/"$i"; done
猜你喜欢
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
相关资源
最近更新 更多