Данные Grep по определенному шаблону

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.

1
16.07.2019, 10:25
1 ответ

Попробуйте это,

grep -o 'CardID="[^"]*"' file
CardID="11209797"
2
27.01.2020, 23:22

Теги

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