Удалить повторяющиеся поля с разными данными

подождите, $! - синтаксическая ошибка, отсутствует пробел. Здесь это не оказывает никакого влияния, потому что вы никогда не запускаете фоновое задание, поэтому $! остается пустым, а команда wait без аргументов, которая ожидает всех фоновых заданий - и поскольку их нет, она немедленно возвращается.

Есть разница между использованием wget --background… и wget… & . Первая команда сообщает wget , что нужно разветвить дочерний процесс, а затем выйти:

(bash)

  fork ——————————————→
  wait                  exec wget --background …
   ⋮
   ⋮                    fork ———————————————————————→
      ←——————————————   exit                           download
  (next script line)                                             ⋮

Когда родительский процесс wget (который является передним планом) возвращается, bash возобновляет выполнение процесса. С помощью wget… & оболочка создает фоновый процесс:

(bash)

  fork ——————————————————→
  (next script line)       exec wget --background …

                           download
                            ⋮

В этом случае вы можете дождаться завершения процесса wget:

wget … &
wait $!

Однако это бессмысленно: запуск фонового задания только для ожидания поскольку это эквивалентно запуску работы на переднем плане.

wget …
1
21.02.2019, 18:46
2 ответа

Я сделал описанным ниже способом

awk '/^loginName:/{x=NR+1}(NR<=x){print}' filename| sed "N;s/\n/ /g"| awk '$0 !~ /name[12]/{print $0}'

выход

loginName:name3 memoryInfo:jsHeapSizeLimit:2181038084
loginName:name4 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name5 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name6 memoryInfo:jsHeapSizeLimit:2181038083
1
27.01.2020, 23:30

Для этой задачи можно использовать AWK.

Первое решение с использованием аналогичной команды egrepдля исключения пользователей:

 egrep -v 'loginName:(name1|name2)' FinalResults.txt | awk '/^loginName:/ { login=$0; } # save line
     /^memoryInfo:jsHeapSizeLimit:/ { 
         if(login!="") { # only if we have a saved loginName line
             printf "%s\t%s\n", login, $0;
             login=""; # clear to avoid printing twice
         }
     }'

При вводе вопроса вывод

loginName:name3 memoryInfo:jsHeapSizeLimit:2181038084
loginName:name4 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name5 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name6 memoryInfo:jsHeapSizeLimit:2181038083

Второе решение с расширенным скриптом AWK и списком исключений в отдельном файле

Предположим, вы создали файл excludeсо всеми пользователями для исключения, по одному в каждой строке

name1
name2

вы можете использовать расширенный сценарий AWK и предоставить файл excludeв качестве первого файла перед файлом входных данных (s)

awk 'NR==FNR {# condition is valid for first file only
        exclude[$0]=1; # add name to exclude map
        next; # stop processing, do not check other rules
     }
     /^loginName:/ { 
         name=substr($0,11); # extract name
         if (!( name in exclude )) login=$0; } # save line if not in exclude list
     /^memoryInfo:jsHeapSizeLimit:/ {
         if(login!="") { # only if we have a saved loginName line
             printf "%s\t%s\n", login, $0;
             login=""; # clear to avoid printing twice
         }
     }' exclude FinalResults.txt

Это дает тот же результат, что и первый сценарий AWK в сочетании с egrep.

1
27.01.2020, 23:30

Теги

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