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 0
si el campo del encabezado no está presente en los datos de esa línea, y 1
si 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.