Разбор текста, чтобы видеть только определенные данные

У меня есть следующие текстовые строки:

.add 7971 [Player: Sunfire (Account: 11309) X: 5839.623047 Y: 600.437439 Z: 650.839722 Map: 571 Selected player: Llubia (GUID: 19369)]  
.add 43956 [Player: Sunfire (Account: 11309) X: 5277.887695 Y: 2862.181641 Z: 446.735931 Map: 571 Selected none:  (GUID: 0)]  
.add 43956 [Player: Sunfire (Account: 11309) X: 5281.407715 Y: 2864.844482 Z: 446.735931 Map: 571 Selected player: Staticbaby (GUID: 19826)]  
.add 43956 [Player: Sunfire (Account: 11309) X: 5231.464844 Y: 1437.029175 Z: 648.498535 Map: 571 Selected player: Sunfire (GUID: 15295)]  
.add 44077 [Player: Sunfire (Account: 11309) X: 5231.464844 Y: 1437.029175 Z: 648.498535 Map: 571 Selected player: Sunfire (GUID: 15295)]  
.add 49285 [Player: Sunfire (Account: 11309) X: 16225.323242 Y: 16252.759766 Z: 12.790466 Map: 1 Selected none:  (GUID: 0)]  
.add 44115 175 [Player: Elmasguapo (Account: 11309) X: 1659.845093 Y: -4198.589844 Z: 56.382870 Map: 1 Selected none:  (GUID: 0)]  
.add 34078 [Player: Sunfire (Account: 11309) X: 16227.969727 Y: 16280.081055 Z: 13.175169 Map: 1 Selected none:  (GUID: 0)]  
.add  |cffffffff|Hitem:41427:0:0:0:0:0:0:0:80|h[Fuego de Artificio de Dalaran]|h|r 50 [Player: Sunfire (Account: 11309) X: 16221.392578 Y: 16260.944336 Z: 13.255954 Map: 1 Selected none:  (GUID: 0)]  
.add  |cffffffff|Hitem:45932:0:0:0:0:0:0:0:80|h[Gelatina Negra]|h|r [Player: Sunfire (Account: 11309) X: 5874.347168 Y: 679.056763 Z: 167.483719 Map: 571 Selected player: Assasins (GUID: 19438)]  
.add  |cffffffff|Hitem:45932:0:0:0:0:0:0:0:80|h[Gelatina Negra]|h|r [Player: Sunfire (Account: 11309) X: 5873.767090 Y: 679.386841 Z: 167.435257 Map: 571 Selected player: Assasins (GUID: 19438)]  
.add  |cffffffff|Hitem:45932:0:0:0:0:0:0:0:80|h[Gelatina Negra]|h|r [Player: Sunfire (Account: 11309) X: 16226.880859 Y: 16247.247070 Z: 12.286857 Map: 1 Selected player: Irmtarget (GUID: 18521)]  
.add  |cffffffff|Hitem:45932:0:0:0:0:0:0:0:80|h[Gelatina Negra]|h|r [Player: Sunfire (Account: 11309) X: 16229.297852 Y: 16251.202148 Z: 13.081388 Map: 1 Selected player: Irmtarget (GUID: 18521)]  
.add 41600 2 [Player: Sunfire (Account: 11309) X: 16223.138672 Y: 16250.496094 Z: 12.431313 Map: 1 Selected player: Eifreen (GUID: 20341)]  
.add 41600 1 [Player: Sunfire (Account: 11309) X: 16223.138672 Y: 16250.496094 Z: 12.431313 Map: 1 Selected player: Eifreen (GUID: 20341)]  
.add 40516 [Player: Sunfire (Account: 11309) X: 16223.138672 Y: 16250.496094 Z: 12.431313 Map: 1 Selected player: Eifreen (GUID: 20341)]  
.add 44661 [Player: Sunfire (Account: 11309) X: 16223.138672 Y: 16250.496094 Z: 12.431313 Map: 1 Selected player: Eifreen (GUID: 20341)]  
.add 40518 [Player: Sunfire (Account: 11309) X: 16223.138672 Y: 16250.496094 Z: 12.431313 Map: 1 Selected player: Eifreen (GUID: 20341)]  
.add 44005 [Player: Sunfire (Account: 11309) X: 16223.138672 Y: 16250.496094 Z: 12.431313 Map: 1 Selected player: Eifreen (GUID: 20341)]  
.add 45867 [Player: Sunfire (Account: 11309) X: 16223.138672 Y: 16250.496094 Z: 12.431313 Map: 1 Selected player: Eifreen (GUID: 20341)]  
.add 45316 [Player: Sunfire (Account: 11309) X: 16223.138672 Y: 16250.496094 Z: 12.431313 Map: 1 Selected player: Eifreen (GUID: 20341)]  

И я хочу разобрать его, чтобы он выводил что-то вроде этого:

Линия 1 Например - 7971 Llubia Line 3 For Пример - 43956 Staticbaby Line 9 Пример - 45932 Assassins

И так далее .. Это делается в терминале с командами, такими как cut, grep, cat и т. д.

UPDATE: Вот весь файл: http://paste2.org/p/1744102 , чтобы разобрать таким образом.

UPDATE2: Пожалуйста, простите меня, если я не принимаю ответ просто все же. Я жду, когда появится опция щедрости, потому что для меня такие вещи заслуживают щедрости. Поэтому я добавлю щедрость и даю правильный ответ или ответы.

2
задан 29 October 2011 в 03:28

4 ответа

awk '
  # ignore lines with "none:" or "player:" in $(NF-2)
  $(NF-2) ~ /^(none|player):$/ { 
    next   # read next line
  }

  { 
    # remove dots from $2 in every line
    gsub(/\./,"",$2) 
  }

  /\|Hitem:/ {
    # if it has "|Hitem:" in $2, remove everything
    # before and after the colons
    sub(/.+\|Hitem:/,"",$2)
    sub(/:.+/,"",$2)
    print $2,$(NF-2)
    next   # read next line
  }

  {
    print $2,$(NF-2)
  }
' your_file.txt

У строки 380 есть Selected player: (GUID: 6873)]. Вы должны решить, что делать с такими строками (игнорировать их? Печатать идентификатор GUID вместо?).

2
ответ дан 25 May 2018 в 17:28
  • 1
    Это будет игнорировать их, поскольку они не показывают имя. – Luis Alvarado♦ 29 October 2011 в 03:27
  • 2
    Хорошо, я отредактировал свой ответ соответственно. – elmicha 29 October 2011 в 03:51
  • 3
    ВАУ! elmicha, это отличный EXCELLENT-скрипт. Протестировано и отлично работает. Теперь давайте подождем, пока не появится опция «Баунти», поэтому я могу дать бонус за ответ. – Luis Alvarado♦ 29 October 2011 в 04:14
awk '
  # ignore lines with "none:" or "player:" in $(NF-2)
  $(NF-2) ~ /^(none|player):$/ { 
    next   # read next line
  }

  { 
    # remove dots from $2 in every line
    gsub(/\./,"",$2) 
  }

  /\|Hitem:/ {
    # if it has "|Hitem:" in $2, remove everything
    # before and after the colons
    sub(/.+\|Hitem:/,"",$2)
    sub(/:.+/,"",$2)
    print $2,$(NF-2)
    next   # read next line
  }

  {
    print $2,$(NF-2)
  }
' your_file.txt

У строки 380 есть Selected player: (GUID: 6873)]. Вы должны решить, что делать с такими строками (проигнорировать их? Напечатать GUID вместо?).

2
ответ дан 25 July 2018 в 20:56

Это может быть то, что вы хотите?

grep -v 'Selected none' input-file | awk '$2+0 > 0 { print $2, $(NF-2) }'
1
ответ дан 25 May 2018 в 17:28
  • 1
    Хорошо работает, изменяя значение от $ 2 до $ 5, поэтому он отображает числа и имена, как я упоминал выше, но в случаях, подобных строке 9, вместо цифр появляется что-то другое. +1 для классного сценария. – Luis Alvarado♦ 29 October 2011 в 01:34

Невозможно использовать инструменты командной строки для разбора нерегулярного вывода. Было бы лучше использовать python и т. Д.

Если у вас была полная регулярность, например, вы могли бы использовать что-то простое:

awk '{print $2 " " $17}' INPUT

Это пропускает строки «Hitem» из вашего примера.

Это уродливый взлом, но он учитывает строки «Hitem»:

 sed 's/^.*Hitem:\([0-9]*\):0/\1/' INPUT | awk -F: '{print $1 " " $0}' | sed 's/\.add //' | sed 's/^\([0-9]* \).*Selected player: \([A-Za-z]* \).*$/\1 \2/' | egrep -v 'Selected none'

Который дал мне:

7971  Llubia 
43956  Staticbaby 
43956  Sunfire 
44077  Sunfire 
45932  Assasins 
45932  Assasins 
45932  Irmtarget 
45932  Irmtarget 
41600  Eifreen 
41600  Eifreen 
40516  Eifreen 
44661  Eifreen 
40518  Eifreen 
44005  Eifreen 
45867  Eifreen 
45316  Eifreen 

Это не работает добавив дополнительную информацию, однако, поэтому я добавил комментарии / оговорку о регулярности здесь.

1
ответ дан 25 May 2018 в 17:28

Другие вопросы по тегам:

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