una separador linea extraer comparar comando columnas campos archivos archivo bash awk replace

bash - separador - manual awk



AWK reemplaza los valores de columna NULL con los valores de columna de la fila anterior(continuaciĆ³n) (2)

Puede usar este comando de awk para obtener su resultado:

awk ''{sub(/;$/, "")} $1=="HOST"{host=$2} $1=="PORT"{port=$2} $1=="DATABASE"{db=$2} $1=="SCHEMA"{print host, port, db, $2}'' sample2.txt [email protected] 1066 ORACLE_1 DEPT.* [email protected] 1066 ORACLE_1 EMP.* [email protected] 1066 ORACLE_2 JOB.* [email protected] 1066 ORACLE_2 SALARY.* [email protected] 89 MYSQL_1 PURCHASE.* [email protected] 89 MYSQL_2 PRICE.* [email protected] 89 MYSQL_2 PRODUCT.*

Explicación:

  • sub función sub está eliminando el rastreo ; de cada línea
  • Cuando $1=="HOST" almacenamos la 2da columna en un host variable
  • Cuando $1=="PORT" almacenamos la 2da columna en un port variable
  • Cuando $1=="DATABASE" almacenamos la 2da columna en una variable db
  • Cuando $1=="SCHEMA" imprimimos host, port, db, 2nd column

Esta publicación es una enmienda a mi pregunta que hice antes.

Digamos que tengo el siguiente archivo de muestra:

cat sample2.txt HOST [email protected] PORT 1066 DATABASE ORACLE_1 SCHEMA DEPT.*; SCHEMA EMP.*; DATABASE ORACLE_2 SCHEMA JOB.*; SCHEMA SALARY.*; HOST [email protected] PORT 89 DATABASE MYSQL_1 SCHEMA PURCHASE.*; DATABASE MYSQL_2 SCHEMA PRICE.*; SCHEMA PRODUCT.*;

Para el contenido del archivo anterior, me gustaría imprimir solo las columnas al lado de HOST / PORT / DATABASE / SCHEMA y, al mismo tiempo, suponiendo que la última columna en cada fila termine con punto y coma, me gustaría reemplazar la columna que falta valores con los valores de columna de la fila anterior.

@anubhava me ayudó a lograr algo parecido a esto en mi publicación anterior .

cat sample2.txt | awk ''tolower($0)~/^host|^port|^database|^schema/{printf "%s",$2 OFS;}'' | awk -v RS='';'' -v ORS='';/n'' ''NF'' | awk ''NF==1{print c1, c2, c3, $1; next} NF==2{print c1, c2, $1, $2; next} {c1=$1; c2=$2; c3=$3} 1'' | sed ''s|^[[:blank:]]*||g; s|/;$||g'' [email protected] 1066 ORACLE_1 DEPT.* [email protected] 1066 ORACLE_1 EMP.* [email protected] 1066 ORACLE_2 JOB.* [email protected] 1066 ORACLE_1 SALARY.* [email protected] 89 MYSQL_1 PURCHASE.* [email protected] 89 MYSQL_2 PRICE.* [email protected] 89 MYSQL_1 PRODUCT.*

Pero espero que sea como sigue

[email protected] 1066 ORACLE_1 DEPT.* [email protected] 1066 ORACLE_1 EMP.* [email protected] 1066 ORACLE_2 JOB.* [email protected] 1066 ORACLE_2 SALARY.* [email protected] 89 MYSQL_1 PURCHASE.* [email protected] 89 MYSQL_2 PRICE.* [email protected] 89 MYSQL_2 PRODUCT.*

Gracias