2016-07-28 62 views
3

this question开始,我找到split实用程序,它接收一个文件并将其分成均匀大小的块。默认情况下,它会将这些块输出到新文件中,但我想要将它们输出到标准输出中,并用换行符(或任意分隔符)分隔。这可能吗?将`split'工具的输出发送到标准输出

我试图cat testfile.txt | split -b 128 - /dev/stdout

其失败,出现错误split: /dev/stdoutaa: Permission denied

看看帮助文本,看起来这告诉split使用/ dev/stdout作为前缀作为文件名,而不是写入/ dev/stdout本身。它并不指示任何选项直接写入带有分隔符的单个文件。有没有一种方法可以让split这样做,还是有一种不同的工具可以完成我想要的行为?

+0

http://stackoverflow.com/a/38630451/2836621 –

+1

'猫文件| split' - >' Kaz

回答

5

目前尚不清楚正是你想做的事,但也许是--filter选项split将助阵:

--filter=COMMAND 
      write to shell COMMAND; file name is $FILE 

也许你可以直接使用。例如,这一次将读取的文件10个字节,使每个块通过tr命令:

split -b 10 --filter "tr [:lower:] [:upper:]" afile 

如果你真的想发出对流stdout中该块之间有分隔符,你可以这样做是这样的:

split -b 10 --filter 'dd 2> /dev/null; echo ---sep---' afile 

如果afile是我当前目录中的文件,看起来像:

the quick brown fox jumped over the lazy dog. 

然后上面的命令将导致:

the quick ---sep--- 
brown fox ---sep--- 
jumped ove---sep--- 
r the lazy---sep--- 
dog. 
---sep--- 
+0

最后一个例子就是我所要做的行为。虽然这有效,但我最终发现,通常情况下允许分割生成新文件,然后循环遍历它们,然后删除它们。 – ecapstone

0

不,该实用程序不会写任何标准输出。它的standard specification特别说没有使用的标准输出。

如果您使用split,则需要连接创建的文件,在它们之间插入一个分隔符。

如果你只是想插入分隔符每ň条线,你可以使用GNU sed

$ sed '0~3a\-----\' file 

此插入含有-----每3号线的线路。

1

从信息页面: `--filter = COMMAND” 使用此选项,而不是简单地写入到每个输出文件, 写入通过管道到指定的shell命令每个 输出文件。 COMMAND应使用$ FILE环境变量 ,该变量被设置为命令的每个调用 的不同输出文件名。

split -b 128 --filter='cat ; echo ' inputfile 
1

这是做到这一点的一种方法。你将得到每个128个字符变量“var”。

您可以使用您的首选分隔符来打印或使用它进行进一步处理。

#!/bin/bash 

cat yourTextFile | while read -r -n 128 var ; do 
    printf "\n$var" 
done 

你可以在命令行下面使用它:

while read -r -n 128 var ; do printf "\n$var" ; done < yourTextFile 
+1

您可以删除'cat'并在'done'后面加上' Kusalananda

+0

谢谢,更新。 –