дедуплицировать в основном отрицательный awk

Я нашел решение Я должен был добавить «требовать все гранты» в файл конфигурации apache

-3
18.03.2021, 06:16
2 ответа

с некоторыми улучшениями и дедупликацией двух частей в одну.

$2 ~ /\.puml$/ && $2 !~ /(theme|config)\.puml$/ \
{ if($1 !~ /^D$/) { result1= (result1==""? "" : result1 " ") $2 } else {
      split($2, fn, ".")
      result2=(result2==""? "" : result2 " ") fn[1] ".svg"
  }
}
END {
  printf "::set-output name=files::%s\n::warning::%s\n", result1, result1
  printf "::set-output name=files::%s\n::warning::%s\n", result2, result2
}
1
18.03.2021, 22:24

Итак, у вас есть один ввод (или файл, результат git)

A      .config/plantuml/theme.puml
M      .github/workflows/main.yml
M      .github/workflows/plantuml.yml
M       README.md
A       app/gradle.lockfile
A       authn/gradle.lockfile
A       docs/README.md
A       docs/domain-model/README.md
A       docs/domain-model/user.md
A       docs/domain-model/user.puml
A       docs/domain-model/foo.puml
M       settings.gradle.kts
D       user.puml
D       foo.puml

и два awk-скрипта, которые выполняют похожие (, но разные )действия на этом входе.

Я предполагаю, что ваша цель состоит в том, чтобы (как можно сократить )действия этих скриптов.

Первые две строки в точности равны:

$2 ~ /\.puml$/ &&
$2 !~ /(theme|config)\.puml$/

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

{ if ( $1 ~ /^[D]$/ ) then { print "Deleted" } else { print "Changed" } }

Или, если вам нужен более детальный выбор:

{ if ( $1 ~ /^[D]$/  ) then { print "Deleted" } 
  if ( $1 ~ /^[MA]$/ ) then { print "Changed" } }

Хранение каждого файла в одном массиве на самом деле не требуется, поскольку вам нужен список файлов, разделенных пробелами.

Это можно сделать внутри цикла для каждой входной строки (меньше памяти, быстрее):

{ if ( $1 ~ /^[D]$/ ) then { deleted = deleted " " $2 } 
  if ( $1 ~ /^[A]$/ ) then { changed = changed " " $2 } }

Конечно, совпадение может быть точной строкой вместо регулярного выражения (быстрее )и вам также нужно извлечь имя файла без расширения в измененном регистре:

{ if ( $1 == "D" ) then { deleted = deleted " " $2 } 
  if ( $1 == "A" ) then { sub( /\.[^.]+$/, "", $2 ) ; 
                          changed = changed " " $2 ".svg"
                        }
}

Сценарий оболочки для проверки всех идей может быть:

#!/bin/bash

a='\
A      .config/plantuml/theme.puml
M      .github/workflows/main.yml
M      .github/workflows/plantuml.yml
M       README.md
A       app/gradle.lockfile
A       authn/gradle.lockfile
A       docs/README.md
A       docs/domain-model/README.md
A       docs/domain-model/user.md
A       docs/domain-model/user.puml
A       docs/domain-model/foo.puml
M       settings.gradle.kts
D       user.puml
D       foo.puml
'

printf '%s\n' "$a" | awk '
      $2  ~ /\.puml$/ &&
      $2 !~ /(theme|config)\.puml$/ {  
             if ( $1 == "D" ) { deleted = deleted " " $2 }
             if ( $1 == "A" ) { sub(/\.[^.]+$/, "", $2);
                                changed = changed " " $2 ".svg"
             }
      }
      END {
             printf "::set-output name=removed-files::%s\n", deleted
             printf "::warning::removed-files %s\n", deleted
             printf "::set-output name=changed-files::%s\n", changed
             printf "::warning::changed-files %s\n", changed
      }
    '
0
18.03.2021, 22:24

Теги

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