如何使用'split'命令

时间:2013-01-07 01:52:24

标签: shell split

我有一个2000行的文件。我使用以下内容每100行拆分文件。

split -l 100 file.txt outputfile.txt

我想在每个文件内容的末尾添加一个“FFFFFF”,在分割后我还要指定文​​件使用的扩展名,如上面的命令输出如下。

outputfile.txtxa, outputfile.txtxb etc...

我已经阅读了拆分的手册页并浏览了网页,但我找不到解决方案。

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

对于一次性解决方案,您可以使用awk,如下所示:

awk 'NR%100==1 { ++i } { print $0 (NR%100==0 ? "\nFFFFFF" : "") > "outputfile" i ".txt" }' file.txt

此外,这里的优点是更好地控制输出文件名,使它们更漂亮。如果您需要更精美的东西,请告诉我。欢呼声。


user1937的说明:

如果您熟悉modulo operatorNR%100==1将返回第1行,第101行,第201行,第301行等的true。每次都是真的,变量{{ 1}}递增。注意i语句是如何由条件/操作块组成的。因此awk是条件,NR%100==1是行动。你会注意到(希望是)具有打印动作的块缺少条件。因此,每一行输入都是打印的(所有时间)。 ++i的值只是确定输出要打印到哪个文件。

您可能不熟悉的另一点是:i。这是一个 ternary operator,是(NR%100==0 ? "\nFFFFFF" : "")的简写。 HTH。


可以使用以下形式的模式/操作语句构建

if (NR%100==0) print "\nFFFFFF"; else print "")代码:

awk

如您所见,pattern1仅适用于action1。 pattern1 适用于action2。

答案 1 :(得分:1)

单独拆分你不能做到这一点。此代码可能有所帮助:

split -l 100 file.txt outputfile_
find . -name outputfile_\* -exec sh -c 'echo "FFFFFF" >> {} && mv {} {}.txt' \;

这将导致文件outputfile_aa.txtoutputfileab.txt等,这些文件将以FFFFFF结尾。

这样做如下:首先我们将前缀为outputfile_的文件拆分为生成文件outputfile_aaoutputfile_ab等。然后我们调用find命令将它们全部收集起来用它来执行命令。有一个小问题,您无法在find命令中使用重定向,因此我们将重定向包装到shell脚本中并使用sh执行整个操作。 {}将替换为每个单独的文件名(在-exec的手册页中查找find);因此,脚本首先将FFFFFF字符串附加到文件末尾,然后重命名该文件以添加txt扩展名。