AWK用previous行的列值(续)代替NULL列值 [英] AWK replace NULL column values with column values of previous row (continuation)

查看:256
本文介绍了AWK用previous行的列值(续)代替NULL列值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个帖子是一项修正案,我的问题,我问前面的here.

This post is an amendment to my question I asked earlier here.

说我有下面的示例文件:

Say I have below sample file:

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 /数据库/模式,并在同一时间假设每一行中的最后一列用分号结束仅列,我想更换缺少的列值与previous行的列值。

For the content in the above file, I would like to print only the columns next to HOST/PORT/DATABASE/SCHEMA and at the same time assuming that the last column in every row ends with semicolon, I would like to replace the missing column values with the column values of previous row.

@anubhava帮我实现了接近它作为我的<一以下href=\"http://stackoverflow.com/questions/36318857/awk-replace-null-column-values-with-column-values-of-$p$pvious-row/36319031?noredirect=1#comment60305930_36319031\">$p$pvious帖子:

@anubhava helped me to achieve something close to it as following in my 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.*

但我希望它是如下

But I am expecting it to be as following

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

感谢

推荐答案

您可以使用此单AWK 命令来获得您的输出:

You can use this single awk command to get your output:

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

说明:


  • 功能是消除拖尾; 每行

  • $ 1 ==HOST我们店里第2列在一个变量主机

  • $ 1 ==PORT我们店里第2列在一个变量端口

  • $ 1 ==数据库我们店里第2列在一个变量分贝

  • $ 1 ==纲目我们打印主机,端口,DB 2列

  • sub function is removing trailing ; from each line
  • When $1=="HOST" we store 2nd column in a variable host
  • When $1=="PORT" we store 2nd column in a variable port
  • When $1=="DATABASE" we store 2nd column in a variable db
  • When $1=="SCHEMA" we print host, port, db, 2nd column

这篇关于AWK用previous行的列值(续)代替NULL列值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆