O u
sinalizador de expansão de parâmetro deve gerar apenas valores de matriz exclusivos. E isso acontece... às vezes.
$ stuff=(a b a c)
$ echo ${(u)stuff}
a b c
$ cat <<< ${(u)stuff}
a b a c
O que da?
O u
sinalizador de expansão de parâmetro deve gerar apenas valores de matriz exclusivos. E isso acontece... às vezes.
$ stuff=(a b a c)
$ echo ${(u)stuff}
a b c
$ cat <<< ${(u)stuff}
a b a c
O que da?
Um ponto fraco no meu cli foo é awk
. Eu provavelmente poderia resolver o seguinte com scripts elaborados, mas tenho certeza de que awk
é a melhor ferramenta para o trabalho e, pela minha vida, não consigo descobrir a abordagem correta.
Digamos que eu tenha um arquivo de dados como este (Ledger):
2019/05/31 (MMEX948) Gürmar
Assets:Cash:Marina ₺-28,14
Expenses:Food:Groceries:Meat ₺28,14
Assets:Cash:Marina ₺-28,14
Expenses:Food:Groceries:Meat ₺28,14
Assets:Cash:Marina ₺-3,45
Expenses:Food:Groceries:Basic ₺3,45
Assets:Cash:Marina ₺-15,00
Expenses:Food:Groceries:Produce ₺15,00
2019/06/01 (MMEX932) A101
Assets:Cash:Caleb $-3.00
Assets:Cash:Marina $-2.50
Expenses:Food:Groceries:Basic $5.50
2019/06/01 (MMEX931) Şemikler Pazar Yeri
Assets:Cash:Marina ₺-24,00
Expenses:Food:Groceries:Basic ₺24,00
Assets:Cash:Marina ₺-31,00
Expenses:Food:Groceries:Meat ₺31,00
Assets:Cash:Marina ₺-65,00
Expenses:Food:Groceries:Produce ₺65,00
Cada parágrafo separado por linha em branco é uma transação , cada linha recuada é um lançamento , cada lançamento tem uma conta e um valor (separado por pelo menos 2 espaços).
Eu quero que duas coisas aconteçam com esses dados. Eu não me importo se isso acontecer no mesmo comando ou não, pode ser mais fácil fazer em uma ou duas passagens, dependendo da ferramenta ...
Todos os lançamentos com valores negativos devem ser organizados após os lançamentos com valores positivos.
Quaisquer lançamentos com valores negativos e contas duplicadas devem ser mesclados. Idealmente, os valores seriam somados, mas isso é muito complicado por causa dos formatos de moeda e não é necessário porque posso regenerar as linhas de valor. A remoção total do valor das postagens mescladas é suficiente, desde que não mais de uma conta única seja mesclada por passagem.
O resultado deve ficar assim:
2019/05/31 (MMEX948) Gürmar
Expenses:Food:Groceries:Meat ₺28,14
Expenses:Food:Groceries:Meat ₺28,14
Expenses:Food:Groceries:Basic ₺3,45
Expenses:Food:Groceries:Produce ₺15,00
Assets:Cash:Marina
2019/06/01 (MMEX932) A101
Expenses:Food:Groceries:Basic $5.50
Assets:Cash:Marina $-2.50
Assets:Cash:Caleb
2019/06/01 (MMEX931) Şemikler Pazar Yeri
Expenses:Food:Groceries:Basic ₺24,00
Expenses:Food:Groceries:Meat ₺31,00
Expenses:Food:Groceries:Produce ₺65,00
Assets:Cash:Marina
Observações que tornam isso um pouco mais complicado do que apenas uma verificação de duplicatas:
Como eu passaria por esse problema em awk
? Ou se Awk não é a melhor solução, qual é? Na maioria das linguagens de script (perl, python, zsh), eu analisaria tudo, jogaria tudo em uma matriz multidimensional, classificaria com base em correspondências regex do valor e secundariamente em alfa para as contas, então iteraria sobre ele para produzi-lo, sempre elimine a última quantia e mescle apenas a última duplicata (se houver).
Observe que eu trabalhei em uma maneira de analisar e mesclar transações duplicadas no Awk outro dia:
awk 'NF { if (/^20/) { if (last != $$0) print "\n" $$0; last = $$0 } else { print $$0 } }' |
Mas uma lógica awk mais complicada está me desafiando agora.
Eu tenho um serviço systemd (um executor de CI) que tende a atolar o sistema com trabalhos muito intensivos da CPU. Eu peguei a média de carga voando acima de 100 agora e quero acabar com essa bobagem.
Nada mais no sistema é limitado de forma alguma, então o negócio é que eu quero que todo o resto continue como seria executado agora, mas também:
... para ficar em segundo plano em relação a todo o resto do sistema. Na verdade, eu gostaria que eles tivessem algo como um limite absoluto de 90%, mesmo quando nada mais no sistema precisa dos 10% restantes dos ciclos de CPU, mas se qualquer outra coisa solicitar tempo de CPU, eu gostaria que eles obtivessem tanto quanto eles querem primeiro.
Qual é a melhor maneira de configurar isso? Estou executando o Arch Linux no EC2 e tenho cgroups disponíveis (incluindo cgmanager), mas nunca os usei.