逐行拆分文件并控制生成的文件扩展名

Rog*_*ach 37 shell filenames split

有一个标准的文件分割命令——split。

例如,如果我想将一个单词文件拆分为 10000 行的几个块,我可以使用:

split -dl 10000 words wrd
Run Code Online (Sandbox Code Playgroud)

它会生成几个格式为 wrd.01、wrd.02 等的文件。

但我想为这些文件指定一个特定的扩展名——例如,我想获得 wtd.01.txt、wrd.02.txt 文件。

有没有办法做到这一点?

don*_*sti 66

这在当时是不可用的,但随着更新版本 ( ? 8.16) 的出现,gnu split可以使用--additional-suffix开关来控制生成的扩展。来自man split

--additional-suffix=SUFFIX
              append an additional SUFFIX to file names.
Run Code Online (Sandbox Code Playgroud)

所以在使用该选项时:

--additional-suffix=SUFFIX
              append an additional SUFFIX to file names.
Run Code Online (Sandbox Code Playgroud)

结果片段将自动以.txt

wrd00.txt
wrd01.txt
.........
Run Code Online (Sandbox Code Playgroud)

  • 无法在 Mac 上运行 (6认同)
  • @swiftshokunin - 我的回答与`gnu split`有关,它是`gnu coreutils`的一部分。如果您通过`homebrew` 安装`coreutils`,它也可以在OSX 上使用,但请注意,默认情况下,在OSX 上,`gnu` 实用程序的名称前有一个`g`(例如`gstat` 而不是`stat`)所以你调用它作为`gsplit`(或根据指南[此处](https://coderwall.com/p/2khjya/install-100-core-cli-utilities-with-1-command)更改PATH,如果您想将它用作 OSX `split` 上的 `split`)。哈。 (6认同)
  • 我喜欢你的讽刺。我是来自 Apple 世界的 unix n00b。我正在使用 OS X Yosemite,我只是不希望其他人像我一样崩溃和燃烧。我在文档中进行了测试和审查,但我们没有这个参数。我可能错过了一些东西。https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/split.1.html (2认同)
  • 很好的答案。在 OS X 上,使用 `gsplit` 使数字后缀 (-d) 起作用。 (2认同)
  • 哇,我不知道有 gsplit - 它可能来自上面提到的 coreutils,并且它确实有 --additional-suffix。感谢大家对这个解决方案发表评论:) (2认同)
  • @Hussain7 - 当然,只需使用 `--numeric-suffixes=START` 而不是 `-d` 例如,使用您运行 `split -l 100 --numeric-suffixes=05 --additional-suffix=.txt 的操作代码单词wrd`让它从`05`开始...(假设这里是`gnu split`) (2认同)

Kyl*_*nes 16

此类任务最好使用 shell 进行管理。使用 split 然后编写一个简单的循环来重命名文件。例如

for file in wrd.*
do
    mv "$file" "$file.txt"
done
Run Code Online (Sandbox Code Playgroud)

将重命名您的 wrd.01、wrd.02 等文件,以便它们都具有 .txt 扩展名。

  • PS:对于 1000 万行的输入文件 (75 MB),`split+mv` 组合比 `awk` 快 **6 倍**(大约 *3s* vs *18s*)......每行都是它自己的行号...感谢您重新说明“显而易见”:) (7认同)
  • PPS:我刚刚进一步检查了这一点。速度差异与创建的文件数量与 awk 为每一行所做的格式化和算术计算的数量有关,而不管输出文件的数量如何......使用与上述示例相同的输入文件:当有*文件少 100 倍,`split + mv` 比 `awk` 快 **75** 倍:当文件多 *100 倍时,`split + mv` 比 ` 快 **1.5** 倍awk`。所以,对我来说,这个 `split + mv` 方法获胜,毫无疑问。它和 consice 一样(可以说是 moreso),并且比 `awk` 更快。 (3认同)
  • 如果你担心它有 5 行长,试试这个:`for file in wrd.*; 做 mv "$file" "$file.txt"; 完成` :) (3认同)

Kev*_*vin 13

不是 with split,但您可以在之后轻松重命名它们,或者您可以在awk

awk '{filename = "wrd." int((NR-1)/10000) ".txt"; print >> filename}' inputfile
Run Code Online (Sandbox Code Playgroud)