如何在行号处分割文件[关闭]


94

我想从特定的行号中拆分一个400k行长的日志文件。

对于这个问题,让其为任意数字300k。

是否有Linux命令允许我执行此操作(在脚本内)?

我知道split可以按大小或行号将文件分成相等的部分,但这不是我想要的。我想要一个文件中的前300k,第二个文件中的最后100k。

任何帮助,将不胜感激。谢谢!

再三考虑,这将更适合于超级用户或服务器故障站点。


16
我认为这个问题很好。您有一个要使用Shell脚本解决的编程任务;如果它是使用广泛使用的Unix工具的单行代码,那就更好了!
吉姆·刘易斯2010年

我也这么想 但是话又说回来,我不是在写shell脚本:)哦,好吧,无论如何我找到了答案。谢谢
denormalizer 2010年

5
毫无疑问,这是一个很好的问题,它是一个编程问题,并且也不是太本地化
Peter

9
为什么这是一个离题的问题?思想警察比以往任何时候都更加疯狂。
卡雷尔·比列克(KarelBílek),

6
尽管这个问题可能有点不合时宜,但它受到高度赞扬,并且是搜索引擎中第一个查询“ linux split file at line”的结果。因此,我建议重新打开这个问题,以便可以添加其他有价值的答案。或至少链接到SU上最相关的问题。
安托万·平沙德

Answers:


178
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

另外,再三考虑,拆分将适用于您的情况,因为第一个拆分大于第二个拆分。拆分将输入的余额放入最后的拆分,因此

split -l 300000 file_name

xaa对于30 xab万行输入,将输出30万行和10万行。


谢谢。在超级用户处找到了一个类似回答的问题。使用tail等,是的,拆分适用于我的示例,但并非总是100K。
规范器

2
如果您尝试在Windows上执行此操作并且不想使用Cygwin,则此项目将所有所需的utils作为本机win32二进制文件提供-unxutils.sourceforge.net
Jonathon Hill

15
我会用tail -n +L file_name > bottom_file在那里根本L=K+1没有必要运行wc第一
Hashbrown

2
我宁愿使用sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log。IHMO,这更直接,不需要计算总行数。同样,如果在每个命令的执行之间添加了行,它仍然可以工作。
安托万·平沙德

对于某些文件,此答案未列出任何内容,但Hashbrown建议的编辑可解决此问题。
scharette
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.