我需要打开目录并在创建文件时对文件进行排序.我可以找到一些讨论,使用Perl的标签,排序和文件,根据修改日期对文件进行排序.我认为这是比创建日期排序更常见的需求.我用Perl.之前有一些关于按照Perl以外的其他语言按创建日期排序的帖子,例如php或java.
例如,我需要执行以下操作:
opendir(DIR, $ARGV[0]);
my @files = "sort-by-date-created" (readdir(DIR));
closedir(DIR);
do things with @files...
Run Code Online (Sandbox Code Playgroud)
CPAN在sort命令上有一个页面,但它不是我可以访问的,我在页面上找不到"日期"或"创建"字样.
为了回应编辑,我应该说我使用Mac,OS 10.7.我知道在Finder中,有一个按创建日期选项排序,因此必须有某种指示创建日期以某种方式附加到此系统中的文件.
在回答答案时,以下是尝试对文件进行排序的另一个脚本版本:
#!/usr/bin/perl
use strict; use warnings;
use File::stat; # helps with sorting files by ctime, the inode date that hopefully can serve as creation date
my $usage = "usage: enter name of directory to be scanned for SNP containing lines\n";
die $usage unless @ARGV == 1;
opendir(DIR, $ARGV[0]); #open directory for getting file list
#my @files = (readdir(DIR));
my @file_list = grep ! …Run Code Online (Sandbox Code Playgroud) 我有一个简单的数据文件.文件中的每一行都有四个元素.有些行没有空白条目.其他行有第一个条目,其余三个是空白的,或者更确切地说是"填充"了一个空格.它是制表符分隔文件.
输入文件的示例:
.
.
.
30 13387412 34.80391242 sSN_FIRST
30 13387412 34.80391242 sSN5_40
30.1
30.2
30.3
30.4
31 14740248 65.60590089 s32138223_44
31 14740248 65.60590089 s321382_LAST
.
.
.
Run Code Online (Sandbox Code Playgroud)
重申一下,如果这很重要,我文件中的"空白"实际上包含一个空格.
我的总体目标是在整个文件中"填写"第二和第三列(第四列被忽略).为了做到这一点,我需要我的脚本来识别空白的连续行的集合,加上紧接在前面的行和紧接在连续空行集合之后的行.在上面的例子中,这将是第2-7行.一旦我能够这样做,我可以使用填充的侧翼线中的信息来帮助"填写"两者之间的线中缺失的条目.
我一直在试验这个until函数,但是我没有成功地将它与一个读取数据行的循环耦合.例如,我可以读取行并找到空行:
open( my $FILE, "<$mapfile" );
my @file = <$FILE>;
close $FILE;
for ( my $i = 1 ; $i < scalar @file ; $i++ )
{
my @entries = split( '\t', $file[ $i ] );
if ( $entries[ 1 ] =~ m/ / )
{
print $file[ …Run Code Online (Sandbox Code Playgroud) 我的脚本应该做以下.它需要一个旧的标量列表,并创建一个新的,相应的数字列表.旧列表称为@oldMarkers,新列表称为@newMarkers.
示例输入如下: chr1, chr2, IMP, chr3, IMP, IMP, IMP, chr4
示例输出如下: 1, 2, 2.1, 3, 3.1, 3.2, 3.3, 4
脚本的要点是读取@oldMarkers列表并输出一个列表,其中对于包含字母"chr"的元素的每个实例,一个整数被推入数组@newMarkers.对于@oldMarkers中IMP的每个实例,都会向@newMarkers添加一个十进制数.新的十进制数与前面的数字具有相同的"基本整数",但添加了.1.换句话说,"IMP"的多个后续实例应该具有与最近读取的"chr"条目相同的整数,其上加上小数值,计算与最近"chr"对应的IMP的数量.条目.
下面的脚本几乎100%工作.它甚至通常在以下实例中工作.在@oldMarkers的一些地方,IMP有很多条目.当一行中有超过10个IMP时,代码应该将值推送到@newMarkers,以便该条目块的所有"IMP"具有相同的整数,这也与最近对应的数字相匹配.在@oldMarkers中读取"chr"的实例.对于整数,添加0.1.当小数的值达到.9时,小数"重新开始"回到.1并从那里上升,直到IMP条目的延伸结束.
例如,如果@oldMarkers有一个13"IMP"的块,并且是:
chr1, chr2, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, chr2
然后@newMarkers应该是:
1, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 2.1, 2.2, 2.3, 2.4, 3
脚本摘要:
原始文件包含多行两个元素.第一个元素并不重要,因此在代码中跳过了.每行的第二个元素是一个ID,可以是"chr4"或"IMP".甲while循环读取每一行,将第二元件到阵列@oldMarkers.
然后,按条目读取此数组.该脚本首先询问@newMarkers中的条目是否与原始@oldMarker列表中的"chr"或"IMP"相对应.这是通过第一个if和第一个完成的else.
接下来,对于这两个条件,进一步询问该条目是否跟随对应于"chr"或"IMP"条目的数字本身.这是通过在第一个这样的集合中嵌入if和else设置来完成的.
然后定义新元素并将其推送到@newMarker,具体取决于条件.
就像我说的,这主要是有效的.但是,有时,当IMP的延伸超过10时,脚本不会"回收"小数.相反,它将.1添加到前一个值并输入一个新的整数整数.但对于超过10的其他延伸,它工作正常.它与这个"错误"不一致.
你能发现问题吗?
my @oldMarkers = ();
my @newMarkers = (); …Run Code Online (Sandbox Code Playgroud) 我正在使用Perl.我在目录中创建一个文件数组.隐藏文件,以点开头的文件,位于我的数组的开头.我想实际上忽略并跳过这些,因为我不需要它们在数组中.这些不是我要找的文件.
问题的解决方案似乎很容易.只需使用正则表达式来搜索和排除隐藏文件.这是我的代码:
opendir(DIR, $ARGV[0]);
my @files = (readdir(DIR));
closedir(DIR);
print scalar @files."\n"; # used just to help check on how long the array is
for ( my $i = 0; $i < @files; $i++ )
{
# ^ as an anchor, \. for literal . and second . for match any following character
if ( $files[ $i ] =~ m/^\../ || $files[ $i ] eq '.' ) #
{
print "$files[ $i ] is a hidden file\n";
print scalar @files."\n"; …Run Code Online (Sandbox Code Playgroud) 我编写了一个脚本来解析输入文本文件并输出三个新的文本文件.输入文件有一个标题行,它从三个输出文件中的每一个中省略.输出文件的每一行都获取每个输入文件行的前三个条目,然后只获得输入行中的一部分条目.所有文件都以制表符分隔.
我的问题是我在输出行的末尾不断获得额外的空白区域.在VIM中查看时,我可以在输出文件行的末尾看到此空白区域.在excel中查看时,我看不到这些额外的空白区域.
以前,使用我的脚本的早期版本,我可以使用excel在行的末尾看到额外的空白,但只能使用"全选"功能.excel中显示的数据是我的perl脚本打印数组的结果,我在其中编码print $outfile "@array".我在stackoverflow上的其他地方学到了键入print "@array"会导致一种插值,它会在我的行中添加空格.由此插值产生的白色空格在excel中不会立即可见,但是当使用"全选"来突出显示数据时可以看到.所以,我把代码print $outfile "@array"改为了print $outfile @array.此更改导致输出文件仍然在每个输出行的末尾保持空白,在VIM中可见但在excel中不可见的空白区域.这是我被困的地方.
这是我的下面的脚本.第一部分打开并读取输入文件.然后声明一些数组.接下来,a for loop开始逐行开始解析输入文件,并将适当的内容推送到适当的数组中.对一个阵列实施替换.同样,所有文件都以制表符分隔.最后,阵列打印到三个outfiles,使用措辞print $outfile @array而不是print $outfile "@array".
你看到了问题吗?谢谢!
#!/usr/bin/perl
use strict; use warnings;
die "usage: [ imputed genotype.file ]\n" unless @ARGV == 1;
my $imputed = $ARGV[ 0 ];
open ( my $FILE, "<$imputed" );
my @data = <$FILE>;
my @ADD = ();
my @DOM = ();
my @IMP = ();
for ( my $i = 1; …Run Code Online (Sandbox Code Playgroud) 我想捕获包含在文件的某些行中的数字.我正在使用Perl,我正在使用匹配运算符来捕获相对于文件行中其他符号在特定位置发生的数字.这是一个示例行:
fixedStep chrom=chr1 start=3000306 step=1
Run Code Online (Sandbox Code Playgroud)
以下是脚本的相关部分:
while ( <FILE> ) {
if ( $_=~m/fixedStep/ ) {
my $line = $_;
print $line;
my $position = ($line =~ /start\=(\d+)/);
print "position is $position\n\n";
}
Run Code Online (Sandbox Code Playgroud)
$position打印为1,而不是我需要的数字.根据在线正则表达式工具regex101.com,我正在使用的正则表达式工作; 它捕获了该行中的相应元素.
这是一个非常短的脚本,我试图使用PC的命令提示符来运行一系列脚本.脚本的数量各不相同,但是对于这个例子,假设有10个,编号为0-10.这些脚本是SAS程序文件.我正在使用该system命令,但有一个我无法发现的错误.
use strict; use warnings;
for ( my $i = 0; $i < 10; $i++ ) {
system "sas -SYSIN $i.sas -ICON -NOSPLASH -LOG 'c:\Users\...' -PRINT 'c:\Users\...' ";
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
"Missing braces on \o{} at "perlscript.pl" line 6, near "sas..."
Run Code Online (Sandbox Code Playgroud)
我在system命令后面的文本周围放置了大括号,但是没有修复它.我也试过括号(),但没有快乐.放入额外的大括号或()在读取文件位置时也会给出"无法识别的转义"错误.
perl ×7
arrays ×3
loops ×2
command-line ×1
compare ×1
directory ×1
excel ×1
file ×1
hidden-files ×1
nested-loops ×1
regex ×1
rounding ×1
sas ×1
shell ×1
sorting ×1
text-parsing ×1
vim ×1
whitespace ×1