我有一个包含很多行的文本文件,其布局类似于
zzzzz | id@host.tld |
yyyyy | id@host.tld |
每行大约1000万行中的一行。
使用Grep表达式,如何进行替换以获取
zzzzz
yyyyy
等文件中的每一行
也许使用Perl来重写文件也没关系,我只是不知道很多Perl。
更新1:有时导出会生成:
id@host.tld | zzzzz
id@host.tld | yyyyy
更新2:有时他们将行号留在:
a variable digit row number | zzzzz | id@host.tld |
a variable digit row number | yyyyy | id@host.tld |
更新3:此文件可以包含格式如下的行:
zzzzz | id@host.tld |
yyyyy | id@host.tld |
id@host.tld | zzzzz
id@host.tld | yyyyy
variable digit row number | zzzzz | id@host.tld |
variable digit row number | yyyyy | id@host.tld |
答案 0 :(得分:5)
也可以使用(GNU)grep
来完成:
grep -o '^[^|]*'
修改的:
如果你不想要尾随空格但是想要允许前导空格。在第一个字段中间的空格中,您可以将命令更改为:
grep -o '^[^|]*[^| ]'
答案 1 :(得分:3)
这看起来像是sed的工作:
sed 's/\(.*\) |.*| \(.*\) |.*|/\1 \2/' filename
或
sed 's/ |[^|]*|//g' filename
修改:
修订后的问题更加容易:
sed 's/ |.*//' filename
你甚至可以逃脱
sed 's/ .*//' filename
但这确实是推动它。
答案 2 :(得分:2)
看起来像编辑的问题 - 或者我可能会失去它:)如果您需要的只是第一部分直到“|”像下面这样的东西应该工作
sed 's/\([^|]*\).*/\1/' filename.txt
答案 3 :(得分:1)
使用perl ...用于大文件...
use Tie::File;
tie @array, 'Tie::File', 'file.path/file.name' || die;
for (@array) {
s/^([^\|]+).*/$1/;
}
untie @array;
答案 4 :(得分:1)
Perl one-liner:
perl -e 'while(<>) { /^(.+?) |/ && print "$1\n" }' input.txt > output.txt
应该完美无缺,除非第一个条目可能包含|
。
答案 5 :(得分:0)
perl会非常简单。
您可以在“|”上进行拆分以获取每行的数组。然后打开要写入的文件,并写入“$ array [0] \ n”
您的程序看起来像:
open IN, '<', "someFile.txt";
@lines = <IN>;
close IN;
open OUT, '>', "outfile.txt";
foreach(@lines){
chomp;
@array = split /\s*\|\s*/, $_;
print OUT $array[0] . "\n";
}
close OUT;
您的更新:
Split是一个函数,它接受一个模式,一个表达式并返回一个字符串数组。所以在上面的例子中。模式是正则表达式。 \ s是一个空格,\ |是“|”。所以它说空间为零或多次(\ s *),管道(\ |)和零个或多个空格(\ s *)。
更新1看起来像:
@array = {
[0] => "id@host.com"
[1] => "zzzzzzzzzz"
}
更新2看起来像:
@array = {
[0] => "some Number"
[1] => "zzzzzzzzzz"
[2] => "id@host.com"
}