Как мне получить несколько числовых строк после скобок [], используя sed или awk

#awk #sed

#awk #sed

Вопрос:

У меня есть файл с данными 2k, как показано ниже.Я хочу получить только числовые значения полей updr / udrl / imgr / imgl как 41110.00 120 996.00 523 с разделением табуляцией, где присутствуют файлы updr / updl / imgr / imgl.

Я пытался заменить один шаблон до скобок, но после этого не смог применить другой шаблон для получения чисел.

 echo `sed -n 's/^[.*][^0-9]*[[:space:]]* //p' client_stat.txt > client_stat_onlyData.csv` ; echo `sed -i 's/ /t/g' client_stat_onlyData.csv`
  

Я получаю o / p, как показано ниже, но я не хочу печатать строки udpr / updl / imgr / imgl, я хочу печатать только числовые значения.

 updr    48358.00        updl    120     imgr    1015.00 imgl    523
updr    48562.00        updl    120     imgr    1169.00 imgl    523
updr    48305.00        updl    121     imgr    1210.00 imgl    523
updr    48285.00        updl    121     imgr    1135.00 imgl    523
updr    48459.00        updl    121     imgr    1210.00 imgl    523
updr    48246.00        updl    120     imgr    881.00  imgl    523
updr    48439.00        updl    120     imgr    1109.00 imgl    523
  

Количество подключений = 1
Создание соединения RSSL Хост: 192.168.120.1 Порт: 14002
Версия серверного компонента UPA: ads3.2.2.L1.linux.tis.rrg 64-разрядная
Настройка подключения rmds 0x10a8900
Количество подключений в списке равно 1
Поддержка STANDBY: 0
SupportBatchRequests Initial Open: Да
SupportBatchRequests Переиздание: Да
SupportBatchClose: Да
Запросы SupportViewRequests: Да
SupportOptimizedPauseResume: 0

 [Tue Feb 19 14:42:50.415] updr 41110.00 updl 120 imgr 996.00 imgl 523
    [Tue Feb 19 14:42:51.415] updr 49368.00 updl 121 imgr 845.00 imgl 523

Status Received <388> Status Text: Stale Status for Item REC1000017 Text: F7: Item Preempted
[Tue Feb 19 14:42:52.415] updr 48542.00 updl 121 imgr 1170.00 imgl 523

Status Received <1166> Status Text: Stale Status for Item REC1000410 Text: F7: Item Preempted
[Tue Feb 19 14:42:53.415] updr 47942.00 updl 120 imgr 1133.00 imgl 523

Status Received <1133> Status Text: Stale Status for Item REC1001609 Text: F7: Item Preempted
[Tue Feb 19 14:42:54.415] updr 48513.00 updl 120 imgr 1100.00 imgl 523
  

Комментарии:

1. Теплый прием в SO, особая благодарность за добавление всего, что вы пробовали, и предоставление примеров ввода и ожидаемого результата. Вы почти опубликовали идеальный пост, единственное, чего не хватает, это ТЕГОВ КОДА, пожалуйста, оберните свои образцы тегами кода, используя {} кнопку вашего поста (что вы тоже частично сделали, вам нужно покрыть этим все образцы), продолжайте учиться и продолжайте делиться на этом ЗАМЕЧАТЕЛЬНОМ сайте, ТАК что, приветствия.

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее (он покажет номер рядом со строками, какой бы OP ни был указан для поиска).

 awk '{for(i=1;i<=NF;i  ){if($i ~ /^(updr|udrl|imgr|imgl)$/){val=val?val OFS $(i 1):$(i 1)}};print val;val=""}'  Input_file
  

Или добавив не однострочную форму решения.

 awk '
{
  for(i=1;i<=NF;i  ){
    if($i ~ /^(updr|udrl|imgr|imgl)$/){
       val=val?val OFS $(i 1):$(i 1)
    }
  }
  print val
  val=""
}
'   Input_file
  

В случае, если вы хотите сохранить выходные данные, добавьте сам Input_fie > temp_file amp;amp; mv temp_file Input_file в приведенный выше код. Также, если ваш Input_file разделен табуляцией, и вы хотите иметь вывод в формате, разделенном табуляцией, тогда измените awk на awk 'BEGIN{FS="OFS="t"} сохранить из {for.... кода, как указано выше.

Объяснение: Добавление пояснения к приведенному выше коду.

 awk '                                        ##Starting awk program here.
{                                            ##Startig conditions BLOCK here.
  for(i=1;i<=NF;i  ){                        ##Starting a for lop here from variable i value 1 to till value of NF, where NF is awk OOTB variable and have value of number of fields in current line.
    if($i ~ /^(updr|udrl|imgr|imgl)$/){      ##Checking condition if current field value is startig with strings either updr OR udrl OR imgr OR imgl and ends with any of these then do following.
       val=(val?val OFS $(i 1):$(i 1))       ##Creating variable val whose value is keep concatenating its own previous value here.
    }                                        ##Closing BLOCK for if condition here.
  }                                          ##Closing BLOCK for for loop here.
  print val                                  ##Printing value of variable val here.
  val=""                                     ##Nullifying variable val value here.
}                                            ##Closing main BLOCK now.
'  Input_file                                ##Mentioning Input_file name here.
  

РЕДАКТИРОВАТЬ: Пример запуска кода.

 awk '{for(i=1;i<=NF;i  ){if($i ~ /^(updr|udrl|imgr|imgl)$/){val=val?val OFS $(i 1):$(i 1)}};print val;val=""}'  Input_file
48358.00 1015.00 523
48562.00 1169.00 523
48305.00 1210.00 523
48285.00 1135.00 523
48459.00 1210.00 523
48246.00 881.00 523
48439.00 1109.00 523
  

Комментарии:

1. $i ~ /^(updr|udrl|imgr|imgl)$/ ?

2. @jhnc, спасибо, что сообщили мне короткий путь, теперь изменили решение, спасибо.

3. это также исправление, /updr/ совпадает asdasdsupdrwqwewe . 🙂 Для повышения эффективности вы также могли бы сделать, i ; val = ... $i; i

4. упс. второго i там быть не должно. Идея состоит в том, чтобы пропустить проверку регулярного выражения поля после текущего соответствия (поскольку мы знаем, что это невозможно)

5. Спасибо, ребята, приведенная выше логика работает, вот моя обновленная команда, которую я искал echo awk ' BEGIN {OFS="," ;print "UpdateRate,UpdateLenght,ImgeRate,ImageLength"} /updr/ { for(i=1;i<=NF;i ){if($i ~ /^(updr|updl|imgr|imgl)$/){val=val?val OFS $(i 1):$(i 1)}};print val;val=""}' client_stat.txt > client_stat_onlyData.csv

Ответ №2:

Используя однострочный Perl

  perl -ne ' while( /(updr|udrl|imgr|imgl)s (S )/g ) { print "$2 " } print "n" '  file
  

с вашими заданными входными данными

 $ cat vijaya.txt
updr    48358.00        updl    120     imgr    1015.00 imgl    523
updr    48562.00        updl    120     imgr    1169.00 imgl    523
updr    48305.00        updl    121     imgr    1210.00 imgl    523
updr    48285.00        updl    121     imgr    1135.00 imgl    523
updr    48459.00        updl    121     imgr    1210.00 imgl    523
updr    48246.00        updl    120     imgr    881.00  imgl    523
updr    48439.00        updl    120     imgr    1109.00 imgl    523

$ perl -ne ' while( /(updr|udrl|imgr|imgl)s (S )/g ) { print "$2 " } print "n" ' vijaya.txt
48358.00 1015.00 523
48562.00 1169.00 523
48305.00 1210.00 523
48285.00 1135.00 523
48459.00 1210.00 523
48246.00 881.00 523
48439.00 1109.00 523

$
  

Комментарии:

1. Я ищу команду, используя сценарий оболочки… Спасибо за ваше решение на perl, оно может быть полезно и другим.

2. @ пожалуйста, поделитесь рабочей командой в сценарии оболочки. Тем не менее, я не смог его взломать.

3. Это работает с той же логикой, что и выше, единственное, что выводится в файл после такого-то количества строк, а не в начале файла 49368.00 121 845.00 523 48542.00 121 1170.00 523 echo awk 'BEGIN {print "UpdateRate,UpdateLenght,ImgeRate,ImageLength"} { for(i=1;i<=NF;i ){if($i ~ /^(updr|updl|imgr|imgl)$/){val=val?val OFS $(i 1):$(i 1)}};print val;val=""}' client_stat.txt > client_stat_onlyData.csv

4. Спасибо, ребята, за вашу помощь вот последняя команда, которую я искал для вывода o / p echo awk ' BEGIN {OFS="," ;print "UpdateRate,UpdateLenght,ImgeRate,ImageLength"} /updr/ { for(i=1;i<=NF;i ){if($i ~ /^(updr|updl|imgr|imgl)$/){val=val?val OFS $(i 1):$(i 1)}};print val;val=""}' client_stat.txt > client_stat_onlyData.csv