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ónsub
está eliminando el rastreo;
de cada línea - Cuando
$1=="HOST"
almacenamos la 2da columna en unhost
variable - Cuando
$1=="PORT"
almacenamos la 2da columna en unport
variable - Cuando
$1=="DATABASE"
almacenamos la 2da columna en una variabledb
- Cuando
$1=="SCHEMA"
imprimimoshost, 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
$ awk ''{a[$1]=$2} sub(/;/,""){print a["HOST"], a["PORT"], a["DATABASE"], $2}'' file
[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.*