AWK将NULL列值替换为前一行的列值

时间:2016-03-30 20:15:31

标签: bash awk replace

我有一个示例文件如下:

cat sample.txt

HOST dev@opulex.com
PORT 1066
DATABASE ORACLE_1
SCHEMA DEPT.*;
SCHEMA EMP.*;
DATABASE ORACLE_2
SCHEMA JOB.*;

对于上面示例文件中的内容,我想只打印HOST / PORT / DATABASE / SCHEMA旁边的列。所以,我可以实现如下:

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

dev@opulex.com 1066 ORACLE_1 DEPT.*;
 EMP.*;
 ORACLE_2 JOB.*;

假设每条记录中的最后一列以分号(;)结尾,我如何使用AWK将NULL列值替换为上一行的列值,如下所示:

 dev@opulex.com 1066 ORACLE_1 DEPT.*;
 dev@opulex.com 1066 ORACLE_1 EMP.*;
 dev@opulex.com 1066 ORACLE_2 JOB.*;

先谢谢。!

2 个答案:

答案 0 :(得分:2)

如果您有这些数据:

cat file

dev@opulex.com 1066 ORACLE_1 DEPT.*;
 EMP.*;
 ORACLE_2 JOB.*;

使用awk你可以这样做:

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

<强>输出:

dev@opulex.com 1066 ORACLE_1 DEPT.*;
dev@opulex.com 1066 ORACLE_1 EMP.*;
dev@opulex.com 1066 ORACLE_2 JOB.*;

答案 1 :(得分:0)

另一个awk替代

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

dev@opulex.com 1066 ORACLE_1 DEPT.*;
dev@opulex.com 1066 ORACLE_1 EMP.*;
dev@opulex.com 1066 ORACLE_2 JOB.*;