Когда вы добавляете данные в файл, который читаете, вы рискуете войти в бесконечный цикл и постоянно увеличивать размер файла по мере того, как вы в конечном итоге обрабатываете данные, которые вы написали ранее.
Вы можете защититься от этого с помощью таких вещей, как:
perl -pe '
BEGIN{seek(STDOUT,0,2);$end = tell STDOUT}
last if tell(ARGV) > $end;
s/i/o/' < file >> file
Внутри Perl-скрипта:
open OUT, ">>", "file" or die "open file: $!";
open IN, "<", "file" or die "open file: $!";
seek(OUT,0,2) or die "seek: $!";
$end = tell OUT;
while (tell IN < $end && <IN>) {
s/i/o/;
print OUT $_;
}
close IN;
close OUT;
Вы можете установить разделитель полей awk на пробел или +
, а затем выполнить классический ассоциативный массив на основе de -дублирования:
$ awk -F'[ \t+]' '!seen[$1]++' file
ICR1 +
IRT1 +
LSR1 -
NME1 +
PWR1 -
Q0017 -
Q0020 -
Я добился того же, используя команду sed
sed -n '/^.\{1,5\}.$/p' filename
выход
ICR1 +
IRT1 +
LSR1 -
NME1 +
PWR1 -
Q0017 -
Q0020 -
Возможно, я неправильно понял проблему, но, похоже, это работает:
grep -v '+.' file
Выход:
ICR1 +
IRT1 +
LSR1 -
NME1 +
PWR1 -
Q0017 -
Q0020 -