标签: cat

Haskell使用Data.ByteString实现unix的"cat"程序

我有以下Haskell代码,实现了"cat"unix命令行实用程序的简单版本.在400MB文件上以"时间"测试性能,速度大约慢3倍.(我用来测试它的确切脚本在代码下面).

我的问题是:

  1. 这是性能的有效测试吗?
  2. 如何让这个程序运行得更快?
  3. 如何识别Haskell程序中的性能瓶颈?

关于问题2和3:我使用了GHC -prof,然后使用+ RTS -p运行,但我发现这里的输出有点无法提供信息.

来源(Main.hs)

module Main where

import System.IO
import System.Environment
import Data.ByteString as BS

import Control.Monad

-- Copied from cat source code
bufsize = 1024*128

go handle buf = do
  hPut stdout buf
  eof <- hIsEOF handle
  unless eof $ do
    buf <- hGetSome handle bufsize
    go handle buf

main = do
  file    <- fmap Prelude.head getArgs
  handle  <- openFile file ReadMode
  buf     <- hGetSome handle bufsize
  hSetBuffering stdin $ BlockBuffering (Just bufsize) …
Run Code Online (Sandbox Code Playgroud)

unix performance haskell pipeline cat

23
推荐指数
3
解决办法
1319
查看次数

如何使用ffmpeg合并两个avi文件?

我无法将两个avi视频合并在一起.谷歌充满了以下例子:

cat file1.avi file2.avi file3.avi > video_draft.avi
after appending the data together using cat above, you need to re-index the draft movie like this:

mencoder video_draft.avi -o video_final.avi -forceidx -ovc copy -oac copy
Now you're video_final.avi file will be right to go.
Run Code Online (Sandbox Code Playgroud)

但它对我不起作用,第一个视频被转换,就是这样.

video merge join ffmpeg cat

22
推荐指数
2
解决办法
3万
查看次数

如何使用cat命令获取文件的最后一行

我在OSX(unix)环境中编写shell脚本.我有一个名为test.properties以下内容的文件:

cat test.properties 得到以下输出:

//This file is intended for 
//blah blah purposes
123
Run Code Online (Sandbox Code Playgroud)

使用cat命令,我怎样才能获得文件的最后一行?

unix macos shell cat

22
推荐指数
2
解决办法
3万
查看次数

Bash:在没有换行的情况下将字符串添加到文件末尾

如何在没有换行符的情况下将字符串添加到文件末尾?

例如,如果我使用>>它将添加到文件的末尾与换行符:

cat list.txt
yourText1
root@host-37:/# echo yourText2 >> list.txt
root@host-37:/# cat list.txt
yourText1
yourText2
Run Code Online (Sandbox Code Playgroud)

我想在yourText1之后添加yourText2

root@host-37:/# cat list.txt
yourText1yourText2
Run Code Online (Sandbox Code Playgroud)

linux bash awk echo cat

21
推荐指数
3
解决办法
5万
查看次数

捕获多个文件的最快方法是什么?

我想知道是否有办法将unix文本文件连接在一起比运行更快file1

这是我面临的问题.我正在处理一个大小为100G的文本文件.我试图通过将文件分成数百个较小的文件并并行处理来改善运行时.最后,我按顺序将生成的文件重新组合在一起.文件读/写时间本身需要数小时.我想找到一种方法来改善以下方面:

cat file1 file2 file3 ... fileN >> newBigFile
Run Code Online (Sandbox Code Playgroud)
  1. 这需要将磁盘空间加倍,因为fileN...... newBigFile占用100G,然后file1需要另外100Gb,然后fileN...... file1被删除

  2. 数据已经在fileN...中cat >>,file1当我真正需要的是数百个文件重新出现为1个文件时,会产生读写时间......

unix concatenation cat

19
推荐指数
5
解决办法
6万
查看次数

在R中,我可以停止打印(cat(""))返回NULL吗?为什么cat("foo")会返回foo>

如果我进入

print(cat(""))
Run Code Online (Sandbox Code Playgroud)

我明白了

NULL
Run Code Online (Sandbox Code Playgroud)

我想用来cat()打印R脚本的进度,但我不明白为什么它会NULL在我所有连接字符串的末尾返回,更重要的是,如何让它停止?

r concatenation paste cat

18
推荐指数
4
解决办法
2万
查看次数

BASH:只有当该函数通过管道传输时,全局变量才能在函数中更新(简单示例)

这有点臭虫,但可能有人可以解释它:

以下脚本不起作用,输出如下:

#!/bin/bash
GLOBAL_VAR="OLD"
myfunc() {
        echo "func before set> $GLOBAL_VAR"
        GLOBAL_VAR="NEW"
        echo "func after set> $GLOBAL_VAR"
}
myfunc | cat
echo "final value> $GLOBAL_VAR"
Run Code Online (Sandbox Code Playgroud)

输出:

func before set> OLD
func after set> NEW
final value> OLD
Run Code Online (Sandbox Code Playgroud)

现在,只需脱掉| cat它就行了!

#!/bin/bash
GLOBAL_VAR="OLD"
myfunc() {
        echo "func before set> $GLOBAL_VAR"
        GLOBAL_VAR="NEW"
        echo "func after set> $GLOBAL_VAR"
}
myfunc
echo "final value> $GLOBAL_VAR"
Run Code Online (Sandbox Code Playgroud)

输出:

func before set> OLD
func after set> NEW
final value> NEW
Run Code Online (Sandbox Code Playgroud)

linux variables bash cat

17
推荐指数
1
解决办法
1万
查看次数

如何拆分文件并将它们并行处理然后再缝合?UNIX

我有一个文本文件infile.txt:

abc what's the foo bar.
foobar hello world, hhaha cluster spatio something something.
xyz trying to do this in parallel
kmeans you're mean, who's mean?
Run Code Online (Sandbox Code Playgroud)

文件中的每一行都将通过此perl命令处理到out.txt中

`cat infile.txt | perl dosomething > out.txt`
Run Code Online (Sandbox Code Playgroud)

想象一下,如果文本文件是100,000,000行.我想并行化bash命令,所以我尝试了这样的事情:

$ mkdir splitfiles
$ mkdir splitfiles_processed
$ cd splitfiles
$ split -n3 ../infile.txt
$ for i in $(ls); do "cat $i | perl dosomething > ../splitfiles_processed/$i &"; done
$ wait
$ cd ../splitfiles_processed
$ cat * > ../infile_processed.txt
Run Code Online (Sandbox Code Playgroud)

但是,有一种不那么冗长的方式来做同样的事情吗?

unix bash perl split cat

17
推荐指数
2
解决办法
4236
查看次数

HP-UX - 如何在不提取文件的情况下从tar存档中读取文本文件?

我有一个tar包含几个文本文件的存档.我想编写一个脚本来显示(stdout)文件的内容,而不将其提取到当前目录.

其实我想做同样的事情:

tar tf myArchive.tar folder/someFile.txt
cat folder/someFile.txt
rm -R folder
Run Code Online (Sandbox Code Playgroud)

但没有rm......

我试过这种方式,但它不起作用:

tar tf myArchive.tar folder/someFile.txt | cat
Run Code Online (Sandbox Code Playgroud)

谢谢

bash text hp-ux tar cat

15
推荐指数
1
解决办法
2万
查看次数

为什么不能使用cat逐行读取文件,其中每行都有分隔符

我有一个包含这样的文本文件:

abc 123, comma
the quick brown fox
jumped over the lazy dog
comma, comma
Run Code Online (Sandbox Code Playgroud)

我写了一个剧本

for i in `cat file`
do
   echo $i
done
Run Code Online (Sandbox Code Playgroud)

由于某种原因,脚本的输出不会逐行输出文件,而是在逗号和换行符处将其分开.为什么猫或"为了等待cat xyz"这样做,我怎么能不这样做呢?我知道我可以使用

while read line
do
   blah balh blah
done < file
Run Code Online (Sandbox Code Playgroud)

但我想知道为什么cat或"for blah in"这样做是为了进一步理解unix命令.Cat的手册页对我没有帮助,并且在bash手册中查找或循环没有产生任何答案(http://www.gnu.org/software/bash/manual/bashref.html).在此先感谢您的帮助.

linux bash for-loop cat

15
推荐指数
3
解决办法
4万
查看次数

标签 统计

cat ×10

bash ×5

unix ×4

linux ×3

concatenation ×2

awk ×1

echo ×1

ffmpeg ×1

for-loop ×1

haskell ×1

hp-ux ×1

join ×1

macos ×1

merge ×1

paste ×1

performance ×1

perl ×1

pipeline ×1

r ×1

shell ×1

split ×1

tar ×1

text ×1

variables ×1

video ×1