使用命令行复制大文件的一部分

时间:2009-07-01 11:25:07

标签: shell scripting

我有一个包含200万行的文本文件。每行都有一些交易信息。

e.g。

  

23848923748,示例文本,feild2,12 / 12/2008

我想要做的是从某个唯一的交易号码开始创建一个新文件。所以我想将文件拆分到这个数字所在的行。

如何从命令行执行此操作?

我可以通过这样做找到这条线:

cat myfile.txt | grep 23423423423

5 个答案:

答案 0 :(得分:3)

像这样使用sed

sed '/23423423423/,$!d' myfile.txt

只需确认唯一的交易号不能在文件的其他部分(特别是在正确匹配的行之前)中显示为模式。


此处已有“perl”答案,因此,我将再提供一个 AWK 方式: - )

awk '{BEGIN{skip=1} /number/ {skip=0} // {if (skip!=1) print $0}' myfile.txt

答案 1 :(得分:2)

在我的tmp目录中的随机文件中,这是我从名为popd的文件中匹配tmp.sh以后的行输出的所有内容:

tail -n+`grep -n popd tmp.sh | cut -f 1 -d:` tmp.sh

tail -n+X从该行号开始匹配; grep -n输出lineno:filename,并从lineno剪切提取grep

因此,对于您的情况,它将是:

 tail -n+`grep -n 23423423423 myfile.txt | cut -f 1 -d:` myfile.txt

它确实应该从第一次出现以来匹配。

答案 2 :(得分:0)

这不是一个漂亮的解决方案,但如何使用grep的-A参数?

像这样:

mc@zolty:/tmp$ cat a
1
2
3
4
5
6
7
mc@zolty:/tmp$ cat a | grep 3 -A1000000
3
4
5
6
7

我在此解决方案中看到的唯一问题是1000000幻数。可能有人会在不使用这种技巧的情况下知道答案。

答案 3 :(得分:0)

您可以使用Grep获取行号,然后使用Tail将文件从该点打印到输出文件中。

抱歉,我没有显示实际代码,但希望这个想法很明确。

答案 4 :(得分:0)

坦白说,我会写一个快速的Perl脚本。对于这样的事情(相对简单的问题)来说它是非常宝贵的,只要更复杂的事情发生了它(就像它会做的那样!)那么你将需要额外的力量。

类似的东西:

#!/bin/perl

my $out = 0;
while (<STDIN>) {
   if /23423423423/ then $out = 1;
   print $_ if $out;
}

并使用以下命令运行:

$ perl mysplit.pl < input > output

未经测试,我很害怕。