【问题标题】:Move top 1000 lines from text file to a new file using Unix shell commands使用 Unix shell 命令将前 1000 行从文本文件移动到新文件
【发布时间】:2010-10-22 12:12:08
【问题描述】:

我希望将包含超过 5000 万个条目的文本文件中的前 1000 行复制到另一个新文件中,并从原始文件中删除这些行。

有没有办法在 Unix 中使用单个 shell 命令来做同样的事情?

【问题讨论】:

  • @gagneet:您要完成的高级任务是什么?您是将文件分成块还是什么?可能有一种替代方法可以避免像这些答案一样重写整个文件。
  • @Phil 我的回答不会重写整个文件
  • @Phil:我希望将原始文件中的一些行转换为另一种格式。同样,我需要首先从这个 BIG 文件中导出这些行,然后将它们转换并复制到另一个文件中。但是解析这个文件需要很长时间,并且机器会挂起,因为正在使用将近 11G 的内存。
  • 您可能希望使用文件的子集进行概要分析。特别是,使用“时间”来测试您系统上的 sed 和其他核心实用程序,以及您用于解析文件的任何其他工具,是否在文件系统或内存中运行。

标签: unix shell copy


【解决方案1】:
head -1000 input > output && sed -i '1,+999d' input

例如:

$ cat input 
1
2
3
4
5
6
$ head -3 input > output && sed -i '1,+2d' input
$ cat input 
4
5
6
$ cat output 
1
2
3

【讨论】:

  • @Alex,你有一个名为“input”的文件吗?
  • 我想你的意思是“猫>输入”。我仍然收到相同的错误消息: $ cat > input 1 2 3 4 5 6 $ head -3 input > output && sed -i '1,+2d' input sed: 1: "input": command i expects \ 后跟文字
  • 这不起作用。或者,如果有,它也适用于特定版本的 sed。
  • 好的,我正在使用 FreeBSD,它没有 GNU 版本的 sed。我添加了一个答案,其中包括 sed 与 tail 的测试运行,表明 tail 更快。然而,这只是一项测试。尽管如此,head/tail/cp/rm 似乎有跨 UNIX 的标准实现,如果更快,似乎比 sed 更可取。
【解决方案2】:
head -1000 file.txt > first100lines.txt
tail --lines=+1001 file.txt > restoffile.txt

【讨论】:

  • 赞成,直到我注意到“并从原始文件中删除这些行”要求。
  • 这不会从原始文件中删除行。
  • 有耐心。删除前 1000 行并将其写回需要很长时间。
  • 我只需要复制文件中的前 x 行并将它们存储在另一个文件中。第一行完成了这项工作。
【解决方案3】:

出于好奇,我找到了一个带有 GNU 版本 sed (v4.1.5) 的盒子,并使用 11M 行的文本文件测试了迄今为止建议的两种方法的(未缓存)性能:

$ wc -l input
11771722 input

$ time head -1000 input > output; time tail -n +1000 input > input.tmp; time cp input.tmp input; time rm input.tmp

real    0m1.165s
user    0m0.030s
sys     0m1.130s

real    0m1.256s
user    0m0.062s
sys     0m1.162s

real    0m4.433s
user    0m0.033s
sys     0m1.282s

real    0m6.897s
user    0m0.000s
sys     0m0.159s

$ time head -1000 input > output && time sed -i '1,+999d' input

real    0m0.121s
user    0m0.000s
sys     0m0.121s

real    0m26.944s
user    0m0.227s
sys     0m26.624s

这是我使用的 Linux:

$ uname -a
Linux hostname 2.6.18-128.1.1.el5 #1 SMP Mon Jan 26 13:58:24 EST 2009 x86_64 x86_64 x86_64 GNU/Linux

对于这个测试,至少,看起来sedtail 方法慢(27 秒 vs ~14 秒)。

【讨论】:

    【解决方案4】:

    这是一个单行但使用四个原子命令:

    head -1000 file.txt > newfile.txt; tail +1000 file.txt > file.txt.tmp; cp file.txt.tmp file.txt; rm file.txt.tmp
    

    【讨论】:

    • 他想将前 1000 行从一个文件移动到另一个文件。这将删除除前 1000 行之外的所有行,即错误。
    • 如果有“超过 5000 万个条目”,尾巴会很慢。
    • 你为什么用“cp file.txt.tmp file.txt; rm file.txt.tmp”而不是“mv file.txt.tmp file.txt”?
    • cp 和 rm 是原子文件系统操作。 mv 不是。
    • 请参阅下面的答案,了解每个 tail 与 sed 方法的一个未缓存试验。
    【解决方案5】:

    Perl 方法:

    perl -ne 'if($i<1000) { print; } else { print STDERR;}; $i++;' in 1> in.new 2> out && mv in.new in
    

    【讨论】:

      【解决方案6】:

      使用管道:

      cat en-tl.100.en | head -10
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 2015-11-15
        • 1970-01-01
        相关资源
        最近更新 更多