小编Ole*_*nge的帖子

Perl:将一个字节加上STDIN传递给另一个命令

我想有效地做到这一点:

my $buf;
my $len = read(STDIN,$buf,1);
if($len) {
    # Not empty                                                                                                          
    open(OUT,"|-", "wc") || die;
    print OUT $buf;
    # This is the line I want to do faster
    print OUT <STDIN>;
    exit;
}
Run Code Online (Sandbox Code Playgroud)

任务是wc仅在有任何输入时启动.如果没有输入,程序应该退出.

wc这只是一个例子.它将被一个更复杂的命令所取代.

输入可能是几TB的数据,所以我真的不想触摸那些数据(甚至没有a sysread).我试过做:

    pipe(STDIN,OUT);
Run Code Online (Sandbox Code Playgroud)

但这不起作用.有没有其他方法可以告诉OUT,在获得第一个字节后,它应该只读取STDIN?也许一些开放式("> =&2")体操结合exec

io perl

8
推荐指数
1
解决办法
221
查看次数

Perl线程:如何制作一个制作人?

我有一个运行速度很慢的功能.我需要在程序的主要部分输入该函数.所以我想做一些类似于UNIX命令的东西yes,它产生尽可能多的输入,但只需要多一点.不像yes我不想要STDIN的值,但我想要Perl队列中的值.

换句话说:这个问题不是关于文件句柄的选择,而是关于线程维护的队列.

我想,元代码看起来与此类似:

my $DataQueue = Thread::Queue->new();

my @producers;
my $no_of_threads = 10;
for (1..$no_of_threads) {
  push @producers, threads->create(\&producer);
}

for(<>) {
  # This should block until there is a value to dequeue
  # Maybe dequeue blocks by default - then this part is not a problem
  my $val = $DataQueue->dequeue();
  do_something($_,$val);
}
# We are done: The producers are no longer needed
kill @producers;

sub producer {
   while(1) {
      # How do I wait until …
Run Code Online (Sandbox Code Playgroud)

perl multithreading

7
推荐指数
1
解决办法
172
查看次数

Perl:替换变量时 s/// 的速度

这:

while($read=sysread(STDIN,$buf,32760)) {
    $buf=~s/\r/posttag\rpretag\t/go;
    $buf=~s/\n/posttag\npretag\t/go;
    syswrite(STDOUT,$buf);
}
Run Code Online (Sandbox Code Playgroud)

在我的系统上传输约 200 MB/s。

这:

my $pretag = "pretag";
my $posttag = "posttag";
while($read=sysread(STDIN,$buf,32760)) {
    $buf=~s/\r/$posttag\r$pretag\t/go;
    $buf=~s/\n/$posttag\n$pretag\t/go;
    syswrite(STDOUT,$buf);
}
Run Code Online (Sandbox Code Playgroud)

在我的系统上传输约 100 MB/s。

为什么?

我认为当我使用时,/o内容是变量还是固定字符串应该没有关系。有没有一种简单的方法可以达到第一个的速度?

perl

7
推荐指数
2
解决办法
123
查看次数

Perl:将打开的文件句柄传递给读取STDIN的程序

我从STDIN读了几行.如何将剩余的STDIN传递给从标准输入读取的命令(例如md5sumwc)?

我可以做一个:

read_a_few_lines_from_diamond_operator();
open (C, "|cmd");
while(<>) { print C }
close C;
cleanup_after_C();
Run Code Online (Sandbox Code Playgroud)

但出于效率原因,我不想触摸输入,而是传递STDIN的文件句柄.有点像:

seq 10 | (read A; wc)
Run Code Online (Sandbox Code Playgroud)

read将其余部分传递给之前,尽可能多地读取wc.我不能使用这个解决方案,因为我需要从我的perl程序中启动命令,我需要在cmd完成后完成工作.


我从'foo'文件中读了几行.如何将剩余部分传递给从标准输入读取的命令(例如md5sumwc)?

我可以做一个:

open (F, "<foo");
read_a_few_lines_from_F();
open (C, "|cmd");
while(<F>) { print C }
close C;
cleanup_after_C();
Run Code Online (Sandbox Code Playgroud)

但出于效率原因,我不想触摸输入,而是传递文件'foo'的其余部分.


我有一种感觉,它可以使用欺骗等做select,open(FOO,">&STDOUT),exec 6<&0,fork,pipe.

perl redirect fork filehandle

6
推荐指数
1
解决办法
2266
查看次数

并行grep模式多个文件

我正在使用此命令成功搜索:从ips.txt日志目录(压缩文件)中的 txt 文件中搜索可疑 IP 列表。

root@yop# find /mylogs/ -exec zgrep -i -f ips.txt {} \; > ips.result.txt
Run Code Online (Sandbox Code Playgroud)

我现在想使用并行与它使用..以加快搜索速度。我目前无法找到正确的参数。我的意思是使用模式文件(每行一个)并将其导出到结果文件中。

请问有没有类似的大师?

我发现的更接近的命令是: grep-or-anything-else-many-files-with-multiprocessor-power

但是无法将它与模式文件列表一起使用并将结果导出到文件中......

请帮忙,谢谢大家。

parallel-processing bash grep gnu-parallel

6
推荐指数
2
解决办法
3726
查看次数

将STDIN拆分为多个文件(如果可能,将其压缩)

我有程序(gawk)将数据流输出到其STDOUT.处理的数据实际上是10英镑.我不想将它保存在单个文件中,而是将其拆分为块,并可能在保存之前对每个文件应用一些额外的处理(如压缩).

我的数据是一系列记录,我不想拆分将记录减半.每条记录都匹配以下正则表达式:

^\{index.+?\}\}\n\{.+?\}$

或者为了简单起见,可以假设两行(首先是不均匀的,甚至在从流的开始编号时)始终记录.

我可以吗:

  • 使用一些标准的linux命令通过定义块的优选大小来拆分STDIN?不需要精确给定记录变量大小不能保证它.或者只是def的记录数量.按大小不可能
  • 压缩每个块并存储在一个文件中(在其名称中有一些编号,如001,002等..)

我已经意识到像GNU并行的命令,csplit但不知道如何把它放在一起.如果上面解释的功能可以在不编写自定义perl脚本的情况下实现,那将是很好的.然而,这可能是另一个,最后的解决方案,但再次,不知道如何最好地实现它.

stdin split file gnu-parallel

6
推荐指数
1
解决办法
2763
查看次数

Bash:除最后一个元素之外的所有数组

除了第一个,Bash有一个简洁的方法来给出数组中的所有元素:

"${a[@]:1}"           
Run Code Online (Sandbox Code Playgroud)

为了得到除了最后一个我发现的所有:

"${a[@]:0:$((${#a[@]}-1))}"
Run Code Online (Sandbox Code Playgroud)

但是,伙计,这是丑陋的.

有优雅的选择吗?

bash

6
推荐指数
1
解决办法
2682
查看次数

输出到文件时的 GNU 并行输出进度

我有一个简单的 bash 脚本可以运行:

cat full_path.csv | parallel --progress -j +0 'echo -n {},; pdfgrep -c [^_] {};' > path_count.csv
Run Code Online (Sandbox Code Playgroud)

Parallel 的进度指示器"--progress",写入文件path_count.csv。我只想echo {}pdfgrep {}写入文件,同时显示--progress到屏幕输出。

如果我做 :

cat full_path.csv | parallel --progress -j +0  'echo -n {},>>path_count.csv; pdfgrep -c [^_] {}>>path_count.csv;'
Run Code Online (Sandbox Code Playgroud)

文件 path_count 仍然是乱码。

任何帮助表示赞赏。谢谢阿尔文

parallel-processing bash gnu-parallel

5
推荐指数
1
解决办法
9229
查看次数

R - 在 data.frame 中存储函数

我想返回一个 matrix/data.frame 每行包含参数和文件的内容。

但是,可能有很多文件,所以我更愿意延迟加载文件,因此只有在请求实际内容时才会读取文件。下面的函数主动加载文件,如果as.func=F.

如果它可以延迟加载它们将是完美的,但如果不是内容而是返回一个可以读取内容的函数,这也是可以接受的。

我可以制作读取内容的函数(见下文as.func=T),但由于某种原因,我无法将其放入 data.frame 中以返回。

load_parallel_results <- function(resdir,as.func=F) {
  ## Find files called .../stdout                                                                                                                                                                              
  stdoutnames <- list.files(path=resdir, pattern="stdout", recursive=T);
  ## Find files called .../stderr                                                                                                                                                                              
  stderrnames <- list.files(path=resdir, pattern="stderr", recursive=T);
  if(as.func) {
    ## Create functions to read them                                                                                                                                                                           
    stdoutcontents <-
      lapply(stdoutnames, function(x) { force(x); return(function() { return(paste(readLines(paste(resdir,x,sep="/")),collapse="\n")) } ) } );
    stderrcontents <-
      lapply(stderrnames, function(x) { force(x); return(function() { return(paste(readLines(paste(resdir,x,sep="/")),collapse="\n")) } ) } );
  } else {
    ## Read them                                                                                                                                                                                               
    stdoutcontents <-
      lapply(stdoutnames, function(x) …
Run Code Online (Sandbox Code Playgroud)

r function lazy-evaluation

5
推荐指数
1
解决办法
3319
查看次数

URL作为条形码(不是QR)

如果您有方形空间,QR码非常适合打印机器可读的URL.但如果放在文本中它们看起来很可怕,因为它们比文本行高得多.

有没有办法我可以使用与QR码相同功能的1d条形码(URL是最重要的功能)所以它可以作为正常段落中的文本放置而无需特殊格式化?

如果是:我如何生成这些条形码?

barcode barcode-printing

5
推荐指数
1
解决办法
2891
查看次数