在给定行将文件拆分为两个文件


12

我正在寻找一种在unix中将文件按给定的行号分成两个文件的方法。

split -l 100 file_name与我要查找的内容接近,但是此命令创建了多个文件,每行100行。我正在寻找一个命令,以给定的行号将一个文件分成两个文件。在UNIX中有没有办法做到这一点?

Answers:


13

更严格的解决方案:

(head -100 > f1.txt; cat > f2.txt) < input.txt

1
不错的解决方案。wc像以前的awk解决方案一样,之前不进行计数,并且输入文件仍仅处理一次。
2013年

2
head为了找到输出的前100行,有一点机会读取超过100行f1.txt; 那些多余的字节将不会被看到cat
chepner 2014年

这真是太慢了
sdaffa23fdsf

12

使用awk,因此您只需要对输入文件进行一次传递。以下假定您要在第一个文件中的前122行,在第二个文件中保留其余的行。

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name

这值得赞许。如果要将文件从X拆分为Y,这是最简单的。
Glenn Plas 2014年

这是最容易理解的解决方案。就像是一种魅力……工作,让我觉得我应该把我从1999年左右开始拥有的O'Reilly Sed&Awk书中的灰尘清除掉,sed部分读得很好,awk部分不是那么多。
迈克尔

由于注释中提到了@chepner的原因,这比例外的解决方案要好。您将丢失“ f2.txt”文件中的字符。该解决方案准确有效。awk ftw。
Goran

7

您可以使用headtail获取这两个部分:

head -n K file_name > top_file
tail -n L file_name > bottom_file

其中K是行号,L是从底部开始的行数(总行数- K)。

(您可以使用来获得总行数wc -l file_name)。


5

您可以使用csplit(如果有)执行此操作:

csplit file N+1

会将文件分为两部分,一个部分最多(包括行号)N,另一部分N+1最大部分从行号到最后一行。
如果要拆分(但不包括)行号N

csplit file N

那样太好了!谢谢,它为我很好地解决了问题。
Zertrin '16

将20GB文件拆分为多个文件的最佳性能。
dr0i

@ dr0i-难怪,csplit已针对此工作进行了优化。
don_crissti

使用日期为2008年的csplit拆分200M行文件,我的内存耗尽了。使用日期为2011年的csplit,它起作用了:)
dr0i 2016年

4

两者headtail都具有从文件“另一”端产生行的选项。因此,您有以下两种选择:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

或(其中NNN比的输出小100 wc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

您可以阅读手册页以了解您的版本head以及tail更多信息。


0

您可以使用“ wc”,“ dc”,“ head”和“ tail”。即

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

为了易于使用,您可以在上面将其转换为Shell脚本。

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.