我有一个包含200万行的文本文件。每行都有一些交易信息。
e.g。
23848923748,示例文本,feild2,12 / 12/2008
等
我想要做的是从某个唯一的交易号码开始创建一个新文件。所以我想将文件拆分到这个数字所在的行。
如何从命令行执行此操作?
我可以通过这样做找到这条线:
cat myfile.txt | grep 23423423423
答案 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
未经测试,我很害怕。