【问题标题】:AWK replace NULL column values with column values of previous row (continuation)AWK 用前一行的列值替换 NULL 列值(续)
【发布时间】:2016-07-20 10:22:18
【问题描述】:

这篇文章是对我之前提出的问题here的修正。

假设我有以下示例文件:

cat sample2.txt
HOST dev@opulex.com
PORT 1066
DATABASE ORACLE_1
SCHEMA DEPT.*;
SCHEMA EMP.*;
DATABASE ORACLE_2
SCHEMA JOB.*;
SCHEMA SALARY.*;
HOST orl@opulex.com
PORT 89
DATABASE MYSQL_1
SCHEMA PURCHASE.*;
DATABASE MYSQL_2
SCHEMA PRICE.*;
SCHEMA PRODUCT.*;

对于上述文件中的内容,我想只打印 HOST/PORT/DATABASE/SCHEMA 旁边的列,同时假设每行的最后一列以分号结尾,我想替换缺失的列值与前一行的列值。

@anubhava 帮助我在previous post 中实现了接近它的目标:

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'
    dev@opulex.com 1066 ORACLE_1 DEPT.*
    dev@opulex.com 1066 ORACLE_1 EMP.*
    dev@opulex.com 1066 ORACLE_2 JOB.*
    dev@opulex.com 1066 ORACLE_1 SALARY.*
    orl@opulex.com 89 MYSQL_1 PURCHASE.*
    orl@opulex.com 89 MYSQL_2 PRICE.*
    orl@opulex.com 89 MYSQL_1 PRODUCT.*

但我希望它如下所示

dev@opulex.com 1066 ORACLE_1 DEPT.*
dev@opulex.com 1066 ORACLE_1 EMP.*
dev@opulex.com 1066 ORACLE_2 JOB.*
dev@opulex.com 1066 ORACLE_2 SALARY.*
orl@opulex.com 89 MYSQL_1 PURCHASE.*
orl@opulex.com 89 MYSQL_2 PRICE.*
orl@opulex.com 89 MYSQL_2 PRODUCT.*

谢谢

【问题讨论】:

    标签: bash awk replace


    【解决方案1】:

    您可以使用这个 single awk 命令来获取您的输出:

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

    说明:

    • sub 函数正在从每一行中删除尾随 ;
    • $1=="HOST" 我们将第二列存储在变量host
    • $1=="PORT" 我们将第二列存储在变量port
    • $1=="DATABASE" 我们将第二列存储在变量db
    • $1=="SCHEMA" 我们打印host, port, db, 2nd column

    【讨论】:

    • 太棒了..谢谢!但是你能解释一下这里的逻辑吗..以便像我这样的人可以学习.. :)
    • 我已将其添加到我的答案中。
    【解决方案2】:
    $ awk '{a[$1]=$2} sub(/;/,""){print a["HOST"], a["PORT"], a["DATABASE"], $2}' file
    dev@opulex.com 1066 ORACLE_1 DEPT.*
    dev@opulex.com 1066 ORACLE_1 EMP.*
    dev@opulex.com 1066 ORACLE_2 JOB.*
    dev@opulex.com 1066 ORACLE_2 SALARY.*
    orl@opulex.com 89 MYSQL_1 PURCHASE.*
    orl@opulex.com 89 MYSQL_2 PRICE.*
    orl@opulex.com 89 MYSQL_2 PRODUCT.*
    

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 2014-03-05
      相关资源
      最近更新 更多