2016-03-31 16 views
2

Bu gönderi, daha önce sorduğum soru için bir değişiklik oldu here. AWK NULL sütun değerlerini bir önceki satırın sütun değerleriyle değiştir (devamı)

Ben örnek dosyada aşağıda olduğunu varsayalım: Yukarıdaki dosyada içeriği için

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.*; 

, ben HOST/PORT/VERİTABANI/SCHEMA yanında ve varsayarak aynı anda yalnızca sütunları yazdırmak istiyorum Her satırdaki son sütun noktalı virgülle sonlanır, eksik sütun değerlerini önceki satırın sütun değerleriyle değiştirmek istiyorum.

@anubhava bana benim previous post aşağıdaki şekilde ona yakın bir şey elde etmek yardımcı.

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.* 

Ama

[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.* 

Teşekkür

cevap

2

You aşağıdaki gibi olmasını bekliyorum çıktı almak için bu tek awk komutunu kullanabilirsiniz:

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.* 

Açıklama:

  • sub fonksiyonu, her hattan ; arka kaldırıyor $1=="PORT" bir değişkende 2. sütun saklayın
  • $1=="HOST" bir değişken host
  • 2nd sütun saklarken port
  • Ne zaman biz host, port, db, 2nd column
+1

Müthiş yazdırırken 0 biz bir değişken db

  • yılında 2 sütun saklamak .. teşekkür ederiz! Ama lütfen buradaki mantığı açıklayabilir misiniz? Böylece benim gibi insanlar öğrenebilir .. :) – CodeDevotion

  • +0

    Cevabımı ekledim. – anubhava

    İlgili konular