С помощью команды xargs

Когда вы добавляете данные в файл, который читаете, вы рискуете войти в бесконечный цикл и постоянно увеличивать размер файла по мере того, как вы в конечном итоге обрабатываете данные, которые вы написали ранее.

Вы можете защититься от этого с помощью таких вещей, как:

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;
0
16.01.2019, 17:40
4 ответа

Вы можете установить разделитель полей awk на пробел или +, а затем выполнить классический ассоциативный массив на основе de -дублирования:

$ awk -F'[ \t+]' '!seen[$1]++' file
ICR1 +
IRT1 +
LSR1 -
NME1 +
PWR1 -
Q0017 -
Q0020 -
5
28.01.2020, 02:13

Я добился того же, используя команду sed

sed -n '/^.\{1,5\}.$/p' filename

выход

ICR1 +
IRT1 +
LSR1 -
NME1 +
PWR1 -
Q0017 -
Q0020 -
1
28.01.2020, 02:13

Использование Миллера:

mlr --tsv --implicit-csv-header --headerless-csv-output \
    put -S '$1=gsub($1,"[+].+$","")' then uniq -a inputfile

и вывод:

ICR1    +
IRT1    +
LSR1    -
NME1    +
PWR1    -
Q0017   -
Q0020   -
1
28.01.2020, 02:13

Возможно, я неправильно понял проблему, но, похоже, это работает:

grep -v '+.' file

Выход:

ICR1 +
IRT1 +
LSR1 -
NME1 +
PWR1 -
Q0017 -
Q0020 -
1
28.01.2020, 02:13

Теги

Похожие вопросы