Bash ou AWK tem operador IN como linguagem de programação R?

0

Em R, temos o operador IN para verificar se o elemento está ou não presente na coluna específica.

Por exemplo: se tivermos frutas e comercializar dataframe com fruit_name e produtos como o nome da coluna, respectivamente. E, digamos, temos que verificar quais frutas estão presentes no mercado.

Em R,

available_fruit <- fruits$fruit_name %in% market$products

Existe algum operador no bash ou no AWK que realiza ações similares como% in% em R?

    
por Saman 21.05.2018 / 10:34

3 respostas

3

Awk e Bash têm matrizes associativas, que fornecem uma maneira de descobrir se uma determinada chave / índice está na matriz.

no awk:

awk 'BEGIN{ a["foo"]=1; if ("foo" in a) print "yea"; }'

no Bash:

bash -c 'declare -A a=([foo]=1); if [[ ${a[foo]+x} = x ]]; then echo "yea"; fi'

( ${a[foo]+x} avalia para x se a[foo] estiver definido, para a sequência vazia caso contrário)

Mas não é possível encontrar facilmente um valor específico nos valores dos elementos da matriz. Aqui, a[1] é foo , mas o teste não o encontra (ele encontraria os índices 1 , 2 e 3 ):

awk 'BEGIN{ split("foo bar doo", a); if ("foo" in a) print "foo exists?"; }'

você terá que percorrer o array manualmente:

awk 'BEGIN{ split("foo bar doo", a); for (i in a) if (a[i] == "foo") print "foo exists"; }'

ou no Bash:

bash -c 'a=(foo bar doo); for v in "${a[@]}"; do 
         if [[ $v = "foo" ]]; then echo "foo exists"; fi; done;'
    
por 21.05.2018 / 10:57
1

awk tem um operador in . Ele pode ser usado para acessar os índices em uma matriz (arrays são matrizes / hashes associativos em awk ).

Se os nomes das frutas forem chaves na matriz market , você poderá usar

if (fruit_name in market) { ... }

para verificar se a string em fruit_name é uma chave em market .

Por exemplo

BEGIN { FS = "\t" }

NR == FNR { market[$1] = $2; next }

!($1 in market) { printf("No %s in the market\n", $1 ); next }

{ sum += market[$1] }

END { printf("Total sum is %.2f\n", sum ) }

Executando isso em dois arquivos:

$ awk -f script.awk market_prices mylist

em que market_prices é um arquivo delimitado por tabulação de duas colunas com itens e preços, e mylist é uma lista de itens. O script leria os itens e seus preços do primeiro arquivo e preencheria market com esses e calcularia o custo total dos itens no segundo arquivo, se eles existissem no mercado, informando os itens que não podem ser encontrado.

O operador in também pode ser usado para repetir os índices de uma matriz:

for (i in array) {
    print i, array[i]
}

A ordenação dos índices não pode ser classificada.

    
por 21.05.2018 / 10:41
0

No Awk, você pode verificar se um índice está em uma matriz com o operador in :

$ awk 'BEGIN {arr["foo"]=1; arr["bar"]=2; print "foo" in arr}'
1

O que isto está fazendo é definir uma matriz arr[] com dois valores: arr[foo]=1; arr[bar]=2 .

Em seguida, "foo" in arr verifica se o índice foo está no conjunto de indeces definido em tal matriz. Como isso é verdade, o print retorna 1.

Isso é descrito em Guia do Usuário do GNU Awk → 8.1.2 Referindo-se a um Elemento da matriz :

To determine whether an element exists in an array at a certain index, use the following expression:

indx in array
    
por 21.05.2018 / 10:42

Tags