#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