Предотвращение опасных команд от входа в историю bash [дубликат]

Una solución un poco larga (pero con suerte fácil de seguir)awk:

BEGIN       { FS = OFS = "|" }

function output() {
    if (FNR == 1) return
    data = ""
    for (i in col2) {
        qi   = sprintf("'%s'", i);
        data = (data == "" ? qi : data "," qi)
    }
    print col1, sprintf("{%s}", data), col3
}

$1 == col1 && !($2 in col2) { col2[$2] }

$1 != col1    {
    output()
    col1 = $1; col3 = $3
    delete col2; col2[$2]
}

END { output() }

El bloque BEGINsimplemente establece el separador de campo de entrada y salida en |.

La función output()tomará los datos recopilados encol1(la ID en la primera columna ),col2(una matriz de datos únicos de la segunda columna )ycol3(el primer elemento de datos para este ID en particular de la tercera columna )y envíelo. Itera sobre las claves en col2, citándolas individualmente y agregándolas con comas en -entre la variable de cadena data. Luego imprime col1,data(entre llaves )y col3.

El siguiente bloque se ejecuta cuando encontramos una entrada en la segunda columna que no hemos visto antes para este ID en particular. Simplemente agrega la segunda columna como una clave en col2.

El bloque posterior se ejecuta cuando encontramos una nueva ID en la primera columna. Llama output()y luego restablece las variables recopiladas para comenzar a recopilar datos para esta nueva ID.

En el bloque END, llamamos a output()para generar los datos de la última ID.

Este programa no intentará almacenar todo el archivo en la memoria a la vez, sino que requiere que los datos se clasifiquen en la primera columna.

Ejecutarlo en los datos proporcionados:

$ awk -f script.awk file
field11|{'field12','field32'}|field13
field41|{'field42','field62','field52'}|field43
1
26.06.2019, 12:05
0 ответов

Теги

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