2016-03-30 2 views
1

ich eine Beispieldatei, wie folgend haben:AWK NULL-Spaltenwerte mit Spaltenwerte der vorherigen Reihe ersetzen

cat sample.txt 

HOST [email protected] 
PORT 1066 
DATABASE ORACLE_1 
SCHEMA DEPT.*; 
SCHEMA EMP.*; 
DATABASE ORACLE_2 
SCHEMA JOB.*; 

Für den Inhalt in der obigen Beispieldatei, ich möchte neben HOST nur die Spalten drucken/PORT/DATENBANK/SCHEMA. Also, ich könnte das erreichen, wie folgend:

cat sample.txt | awk 'tolower($0)~/^host|^port|^database|^schema/{printf "%s",$2 OFS;}' | awk -v RS=';' -v ORS=';\n' 'NF' 

[email protected] 1066 ORACLE_1 DEPT.*; 
EMP.*; 
ORACLE_2 JOB.*; 

die letzte Spalte in jedem Datensatz Unter der Annahme, endet mit Semikolon (;), Wie kann ich AWK verwenden, um NULL-Spaltenwerte mit den Spaltenwerten der vorherigen Zeile zu ersetzen, wie folgend:

[email protected] 1066 ORACLE_1 DEPT.*; 
[email protected] 1066 ORACLE_1 EMP.*; 
[email protected] 1066 ORACLE_2 JOB.*; 

Vielen Dank im Voraus.!

Antwort

2

Wenn Sie diese Daten:

cat file 

[email protected] 1066 ORACLE_1 DEPT.*; 
EMP.*; 
ORACLE_2 JOB.*; 

awk verwenden können Sie tun:

awk 'NF==1{print c1, c2, c3, $1; next} 
    NF==2{print c1, c2, $1, $2; next} 
    {c1=$1; c2=$2; c3=$3} 1' file 

Ausgang:

[email protected] 1066 ORACLE_1 DEPT.*; 
[email protected] 1066 ORACLE_1 EMP.*; 
[email protected] 1066 ORACLE_2 JOB.*; 
+1

Vielen Dank für die Antwort. Können Sie bitte die Logik ausarbeiten? – CodeDevotion

+0

Wenn es nur einen Zellenwert 'NF == 1' gibt, dann verwenden wir zuvor gespeicherte Werte in' c1, c2, c3' Variablen. Wenn es zwei Zellenwerte "NF == 2" gibt, verwenden wir zuvor gespeicherte Werte in 'c1, c2'-Variablen. Schließlich, wenn alle Spalten verfügbar sind, speichern wir die Spaltenwerte in 'c1, c2, c3' Variablen (später zu verwenden). – anubhava

+1

Danke für die Erklärung. – CodeDevotion

0

andere awk alternative

$ rev file | 
    awk 'NF>1{c2=$2?$2:c2; c3=$3?$3:c3; c4=$4?$4:c4} 
      {print $1,c2,c3,c4}' | 
    rev 

[email protected] 1066 ORACLE_1 DEPT.*; 
[email protected] 1066 ORACLE_1 EMP.*; 
[email protected] 1066 ORACLE_2 JOB.*; 
+1

Während dieser Code die Frage beantworten kann, bietet zusätzlichen Kontext in Bezug auf _why_ und/oder _how_ es beantwortet die Frage würde deutlich verbessern seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –