Grep -> Как заменить содержимое текстового файла - PullRequest
2 голосов
/ 17 июня 2011

У меня есть текстовый файл, в котором много строк, и он выложен как

zzzzz | id@host.tld |
yyyyy | id@host.tld |

по одному на каждую строку для примерно 10 миллионов строк.

с использованием выражения 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 |

Ответы [ 6 ]

5 голосов
/ 17 июня 2011

Это также можно сделать с помощью (GNU) grep:

grep -o '^[^|]*'

Редактировать :
Если вы не хотите использовать конечные пробелы, но хотите разрешить ведениепробелы соотв.пробелы в середине первого поля, вы можете изменить команду на:

grep -o '^[^|]*[^| ]'
3 голосов
/ 17 июня 2011

Это похоже на работу для sed:

sed 's/\(.*\) |.*| \(.*\) |.*|/\1 \2/' filename

или

sed 's/ |[^|]*|//g' filename

РЕДАКТИРОВАТЬ:
Пересмотренный вопрос еще проще:

sed 's/ |.*//' filename

Возможно, вам даже удастся уйти с

sed 's/ .*//' filename

, но это действительно подталкивает.

2 голосов
/ 17 июня 2011

Похоже, что вопрос отредактирован - или, может быть, я его теряю :) Если все, что вам нужно, это первая часть до "|" что-то вроде следующего должно работать

sed 's/\([^|]*\).*/\1/' filename.txt 
1 голос
/ 17 июня 2011

Perl one-liner:

perl -e 'while(<>) { /^(.+?) |/ && print "$1\n" }' input.txt > output.txt

Должно работать без сбоев, если только первая запись не может содержать |.

1 голос
/ 17 июня 2011

с perl ... для больших файлов ...

use Tie::File;
tie @array, 'Tie::File', 'file.path/file.name' || die;

for (@array) {
    s/^([^\|]+).*/$1/;
}

untie @array;
0 голосов
/ 17 июня 2011

Это было бы довольно просто в 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"
         }
...