Использование awk или sed для извлечения множественной информации из файла

No puede (instalar fácilmente )un RPM en Debian. Debian usa dpkg; RPM tiene su propia base de datos de paquetes y no sabe nada de lo que haya instalado en Debian. rpmestá disponible en Debian, pero es principalmente para manipular paquetes RPM, no para instalarlos.

Para Java en particular, debe usar java-packageen su lugar para convertir el instalador .binque puede descargar de Oracle; vea mi respuesta a su pregunta anterior .

1
26.07.2019, 01:32
3 ответа

С GNU awk:

$ gawk -F' \\(\\) ' '
    /gold\/tool/ {
      items = $2; ids=""; 
      while(match(items,/([0-9]+)\/gold\/tool/,a)) {
        ids = ids ";" a[1]; 
        items = substr(items,RSTART+RLENGTH+1)
      } 
      print $1 ids
    }' file
    Player: 9.8.7.6.5.4.3.2.1;10;15
    Player: 7.6.5.4.3.2.1.9.8;36
    Player: 6.5.4.3.2.1.9.8.7;40
    Player: 5.4.3.2.1.9.8.7.6;50;55
    Player: 4.3.2.1.9.8.7.6.5;10
2
27.01.2020, 23:22

Вдохновлен steeldriver, возможно немного проще:

gawk '{
    g=0
    for (i=5; i<=NF; i++) {
        if (match($i, /^([0-9]+)\/gold/, a)) {
            if (g++ == 0) printf "%s %s", $1, $2
            printf ";%s", a[1]
        }
    }
    if (g > 0) printf "\n"
}' file
1
27.01.2020, 23:22

GNU использует расширенный режим регулярных выражений -E, чтобы упростить написание регулярных выражений. Используемый подход заключается в немедленном отбрасывании любых неинтересных линий, то есть тех, которые не содержат золота. После этого мы удаляем все не золотые медали, удаляя только цифры перед золотой медалью:

$ sed -Ee '
   s/\s*[(][)]\s*/\n/
   \|\n.*[0-9]/gold/|!d
    :a
    /\n$/!{
      \|\n([0-9]+)/gold/\S+\s*|{
      s//;\1\n/;ba
    }
    s|\n\S+\s*|\n|;ba
  }
  s/(^\s*|\s*$)//g
' file.log

Perl делает задачу тривиальной:

$ perl -F'[(][)]' -lane '
   (my $p = $F[0]) =~ s/(^\s*|\s*$)//g;
   my @A = $F[1] =~ m[\D(\d+)/gold/]g;
   print join ";", $p, @A if @A;
' file.log

Результаты:

Player: 9.8.7.6.5.4.3.2.1;10;15
Player: 7.6.5.4.3.2.1.9.8;36
Player: 6.5.4.3.2.1.9.8.7;40
Player: 5.4.3.2.1.9.8.7.6;50;55
Player: 4.3.2.1.9.8.7.6.5;10
0
27.01.2020, 23:22

Теги

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