【发布时间】:2011-03-29 01:00:44
【问题描述】:
我有一个包含 200,000 行的 CSV 文件 (foo.csv)。我需要将它分成四个文件(foo1.csv、foo2.csv...等),每个文件有 50,000 行。
我已经使用 gui 文本编辑器尝试了简单的 ctrl-v/-c,但是我的计算机速度变慢了。
我可以使用哪些 unix 命令来完成这项任务?
【问题讨论】:
我有一个包含 200,000 行的 CSV 文件 (foo.csv)。我需要将它分成四个文件(foo1.csv、foo2.csv...等),每个文件有 50,000 行。
我已经使用 gui 文本编辑器尝试了简单的 ctrl-v/-c,但是我的计算机速度变慢了。
我可以使用哪些 unix 命令来完成这项任务?
【问题讨论】:
我为this topic 编写的这个小shell 脚本与你的非常相似。
这个 shell 脚本 + awk 对我来说很好用:
#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
if (NR >= initial_line && NR <= end_line)
print $0
}' $3
与此示例文件 (file.txt) 一起使用:
one
two
three
four
five
six
命令(从文件的第二行到第四行提取):
edu@debian5:~$./script.sh 2 4 file.txt
此命令的输出:
two
three
four
当然,您可以改进它,例如通过测试所有参数值是否符合预期:-)
【讨论】:
您可以使用sed
【讨论】:
拆分-l50000 foo.csv
【讨论】:
您应该使用head 和tail。
head -n 50000 myfile > part1.csv
head -n 100000 myfile | tail -n 50000 > part2.csv
head -n 150000 myfile | tail -n 50000 > part3.csv
等等……
否则,但无法控制文件名,您可以使用 unix 命令split。
【讨论】:
我没有方便的终端来试用它,但它应该只是split -d -l 50000 foo.csv。
希望命名不是很重要,因为使用-d 选项,输出文件将命名为foo.csv00 .. foo.csv03。您可以添加 -a 1 选项,使后缀为 0-3,但没有简单的方法可以将后缀注入文件名的中间。
【讨论】:
sed -n 2000,4000p somefile.txt
将从第 2000 行到第 4000 行打印到标准输出。
【讨论】: