【问题标题】:Send output from `split` utility to stdout将 `split` 实用程序的输出发送到标准输出
【发布时间】:2016-12-03 08:49:24
【问题描述】:

this question,我找到了split 实用程序,它获取一个文件并将其拆分为大小均匀的块。默认情况下,它将这些块输出到新文件,但我想让它输出到标准输出,用换行符(或任意分隔符)分隔。这可能吗?

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

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

查看帮助文本,似乎这告诉 split 使用 /dev/stdout 作为文件名的 前缀,而不是写入 /dev/stdout 本身。它不表示直接写入带有分隔符的单个文件的任何选项。有没有办法可以欺骗split 这样做,或者是否有其他实用程序可以完成我想要的行为?

【问题讨论】:

标签: bash split stdout


【解决方案1】:

目前尚不清楚您想要做什么,但split--filter 选项可能会有所帮助:

   --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---

【讨论】:

  • 最后一个例子是我想要的行为。虽然这可行,但我最终发现允许 split 像往常一样生成新文件更容易,然后循环遍历它们,然后删除它们。
【解决方案2】:

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

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

【讨论】:

  • 分割标准输出: | split -b 64 --filter="cat;echo" - 'cat' 是打印分割块,'echo' 是添加一个新行。
【解决方案3】:

这是一种方法。您将把每 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

【讨论】:

  • 您可以删除cat 并在done 之后使用&lt;yourTextFile。看起来更整洁,并且避免了分叉 cat 和设置管道。
【解决方案4】:

不,该实用程序不会向标准输出写入任何内容。其中的standard specification 明确表示未使用标准输出。

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

如果你只想在每 N 行插入一个分隔符,你可以使用 GNU sed:

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

这会在每 3 行插入一个包含 ----- 的行。

【讨论】:

    【解决方案5】:

    要将文件分成块,用换行符分隔,并写入标准输出,请使用折叠:

    cat yourfile.txt | fold -w 128
    

    ...将以 128 个字符的“块”写入标准输出。

    【讨论】:

    • 顺便说一句,如果你还想要一个分隔符(除了换行符)添加 |sed -e 's/$//' 或等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2015-08-30
    相关资源
    最近更新 更多