Как разместить товары по заголовку? [закрыто]

Siguiendo la sugerencia de hochi, miré los paquetes adicionales que se instalarían con el administrador de red -. Uno se llamaba policykit -1. Lo instalé, que venía con otros tres paquetes. Tuve que cerrar la sesión y luego volver a iniciarla, pero luego se solucionó el problema.

-2
31.05.2018, 01:04
2 ответа

Si no le importa agregar GNU datamash a la mezcla, simplemente puede serializar las entradas y luego cruzarlas:

awk '
  {for (i=2;i<=NF;i++) {split($i,a,"#"); print $1,a[1],a[2]}}' OFS='\t' file | 
  datamash --filler=0 crosstab 1,2 count 3
    Acou    Agly    Bla Elfa    Flq
Item_A: 1   0   1   0   0
Item_B: 1   0   0   1   1
Item_C: 1   0   1   1   1
Item_D: 0   1   1   1   0

Alternativamente, con GNU awk (que permite arreglos multidimensionales):

gawk '
  BEGIN {
    OFS="\t";
    PROCINFO["sorted_in"] = "@ind_str_asc";
  }
  {
    for (i=2;i<=NF;i++) {
      split($i,a,"#"); 
      h[a[1]] = 1;
      t[$1][a[1]] += a[2];
    }
  } 
  END {
    for (j in h) printf("\t%s", j);
    printf "\n";
    for (i in t) {
      printf("%s",i);
      for (j in h) 
        printf("\t%d", j in t[i] ? t[i][j] : 0);
      printf "\n";
    }
  }' file
    Acou    Agly    Bla Elfa    Flq
Item_A: 1   0   5   0   0
Item_B: 1   0   0   2   2
Item_C: 1   0   4   2   2
Item_D: 0   3   4   2   0
2
28.01.2020, 05:14
BEGIN { OFS = "\t" }

# Collect headers from data
FNR == NR {
    for (i = 2; i <= NF; ++i)
        if (!($i in heads))
            heads[$i]
    next
}

# Output header
FNR == 1 {
    line = "Items"
    for (j in heads)
        line = line OFS j
    print line
}

{
    line = $1
    # Iterate through the header items, testing each field against it
    for (j in heads) {
        found = 0 # assume not found
        for (i = 2; !found && i <= NF; ++i)
            if ($i == j)
                found = 1 # matches header
        line = line OFS found
    }
    print line
}

Ejecutar esto en sus datos (después de haber eliminado las líneas vacías):

$ awk -f script.awk file file
Items   Acou#1  Bla#4   Bla#5   Elfa#2  Agly#3  Flq#2
Item_A: 1       0       1       0       0       0
Item_B: 1       0       0       1       0       1
Item_C: 1       1       0       1       0       1
Item_D: 0       1       0       1       1       0

Tenga en cuenta que debe especificar el archivo de datos de entrada dos veces. Esto se debe a que lo estamos escaneando dos veces. En el primer escaneo, recopilamos los elementos de datos en cada línea (el bloque FNR == NR). En el segundo escaneo, probamos cada elemento de datos recopilados (, los encabezados )contra los datos de cada línea.

El resultado es simplemente 0si el campo del encabezado no está presente en los datos de esa línea, y 1si lo está. Esto no es del todo lo que pediste, así que...

Una variación que trunca los encabezados en el #y utiliza la parte posterior al #como datos para mostrar:

BEGIN { OFS = "\t" }

# Collect headers from data
FNR == NR {
    for (i = 2; i <= NF; ++i) {
        split($i, h, "#")
        if (!(h[1] in heads))
            heads[h[1]]
    }
    next
}

# Output header
FNR == 1 {
    line = "Items"
    for (j in heads)
        line = line OFS j
    print line
}

{
    line = $1
    # Iterate through the header items, testing each field against it
    for (j in heads) {
        found = 0 # assume not found
        for (i = 2; !found && i <= NF; ++i) {
            split($i, h, "#")
            if (h[1] == j)
                found = h[2] # matches header
        }
        line = line OFS found
    }
    print line
}

Ejecutarlo:

$ awk -f script.awk file file
Items   Elfa    Bla     Acou    Agly    Flq
Item_A: 0       5       1       0       0
Item_B: 2       0       1       0       2
Item_C: 2       4       1       0       2
Item_D: 2       4       0       3       0

Tenga en cuenta que el orden de las columnas no está necesariamente ordenado (ya que se almacenan como claves en una matriz asociativa ). Lo dejo como ejercicio para que el lector los clasifique.

3
28.01.2020, 05:14

Теги

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