AWK用previous行的列值(续)代替NULL列值 [英] AWK replace NULL column values with column values of previous row (continuation)
问题描述
这个帖子是一项修正案,我的问题,我问前面的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 variablehost
- When
$1=="PORT"
we store 2nd column in a variableport
- When
$1=="DATABASE"
we store 2nd column in a variabledb
- When
$1=="SCHEMA"
we printhost, port, db, 2nd column
这篇关于AWK用previous行的列值(续)代替NULL列值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!