如何拆分stdout转到几个输出文件?


12

说,我有一个命令command,它将大量行输出到stdout:

line1
line2
.....
lineN

我想将输出保存到磁盘,而不是保存为单个文件,而是保存为每个文件序列具有1000行stdout的文件:

file0001.txt:
-------------
line1
....
line1000

file0002.txt:
-------------
line1001
....
line2000

etc

我试图用谷歌搜索答案,但是每次谷歌都向我tee指示命令时,在这种情况下这是没有用的。可能是我输入了错误的查询。

Answers:


24

保存完文件后,您始终可以split根据行数将文件分成多个文件片段或多个文件。

split -l 1000 output_file

甚至更好地尝试

command | split -l 1000 -

这会将输出流分成每1000行的文件(默认为1000行,不带-l选项)。

下面的命令将为您提供额外的灵活性,以便在生成输出并将其拆分以存储到文件时生成的文件名添加前缀或强制使用前缀。

command | split -l 1000 - small-


我很困惑,所以对于其他人,split [arguments...] [input e.g. "-" for stdin] [output_prefix]例如:tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-将输出一堆名为somedir.tar.part-000001、002 ans 的100MB文件,依此类推。
ThorSummoner

3

您可以使用bash脚本 lines.bash

#!/bin/bash
a=0
while IFS='' read -r line
do
  printf -v filename "%04d.txt" "$((a++/1000))"
  echo "$line" >> $filename
done

并将其用作:

cat long_file.txt | bash lines.bash

我注意到的唯一问题是*登录long_file.txt(有人可以纠正它)。


2
将设置IFS为空字符串,以避免在上拆分单词read。使用-r以禁用反斜杠上read。删除-e以避免反斜杠转义echo。使用引号避免在上拆分单词echo。从4.0开始使用-vbash以避免启动子进程。使用后递增,因为您当前的代码只会在第一个文件中放入999行。a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
manatwork 2011年

@manatwork谢谢。只有我printf没有-v开关。(bash 4.2.10)。至少它不在联机帮助中printf
xralf 2011年

1
man printf文档/ usr / bin / printf,在生命中永远无法设置环境变量。见help printfprintf内置shell的文档。
manatwork 2011年

@manatwork好。该部分似乎还存在语法错误++/
xralf 2011年

1
还有一件事:除非需要显式扩展参数,否则在算术评估中无需使用符号。在算术扩展中,无论如何都要评估变量。
manatwork 2011年
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.