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


28

有一个用于文件拆分的标准命令-split。

例如,如果我想将单词文件分成几行(每行10000行),则可以使用:

split -dl 10000 words wrd

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

但是我想为这些文件指定特定的扩展名-例如,我想获取wtd.01.txt,wrd.02.txt文件。

有办法吗?

Answers:


11

不能使用split,但是以后可以轻松重命名它们,也可以在awk以下位置进行重命名:

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

看起来不错-但不起作用。在您的表单中,抱怨“对>> >>重定向的表达式具有空字符串值”,并且如果“文件”被“更改”为“文件名”,则输出格式为wrd。{文件号}。{行号} .TXT(相当多的人:)
Rogach

@Rogach对不起,我没有测试过,所以我忘了awk没有做整数除法。我已经测试过了。
凯文(Kevin)

49

当时该功能不可用,但是使用的最新版本(≥ 8.16gnu split可以使用该--additional-suffix开关来控制生成的扩展名。来自man split

--additional-suffix=SUFFIX
              append an additional SUFFIX to file names.

因此,使用该选项时:

split -dl 10000 --additional-suffix=.txt words wrd

生成的片段将自动以.txt

wrd00.txt
wrd01.txt
.........

3
无法

2
我爱你的讽刺。我是来自Apple World的Unix n00b。我使用的是OS X Yosemite,但我不希望其他人像我一样崩溃和燃烧。我在文档上进行了测试和审查,但没有此参数。我可能错过了一些东西。developer.apple.com/library/mac/documentation/Darwin/Reference/...
ericgu

5
@swiftshokunin-我的回答与的gnu split一部分有关gnu coreutils。它也可在OSX如果你安装了coreutils通过homebrew,但请注意,在默认情况下,在OSX中,gnu公用事业有个g前置到他们的名字(例如gstat代替stat),所以你调用它gsplit(或改变路径,按照指导在这里,如果你想split在OSX 上使用它split)。HTH。
don_crissti

1
好答案。在OS X上,用于gsplit获取数字后缀(-d)。
布伦特·浮士德2015年

1
哇,我不知道有gsplit-可能来自上述的coreutils,并且确实有--additional-suffix。感谢大家评论这个解决方案:)
卢卡斯Rysiak

13

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

for file in wrd.*
do
    mv "$file" "$file.txt"
done

会重命名您的wrd.01,wrd.02等文件,因此它们的扩展名均为.txt。


这很明显,但这会破坏bash脚本的简洁性。
罗加奇

1
Unix的理念是为您提供一组简单的工具,然后将它们组合起来即可完成工作。在您的问题中,“ bash脚本的简洁性”不是明确要求。
凯尔·琼斯

7
PS:对于一千万个行输入文件(75 MB)split+mv,该组合比(大约3s18s快6倍 ...每行中的文本都是其自己的行号...感谢您重新声明“显而易见的” :)awk
Peter.O 2012年

3
PPS:我只是进一步检查了一下。速度差异与创建的文件数与awk为每一行所做的格式化和算术计算数无关,而与输出文件的数目无关...使用与上述示例相同的输入文件:100倍较少的文件,split + mv75更快倍awk:当有100倍以上的文件,split + mv1.5比快倍awk。因此,对我来说,这种split + mv方法胜出,放手。这是合理的(可以说是更多),并且比更快awk
Peter.O 2012年

1
如果您担心它有5行长,请尝试以下方法:for file in wrd.*; do mv "$file" "$file.txt"; done:)
Tony
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.