如何使用AWK仅打印匹配旁边的列

时间:2016-03-07 17:01:55

标签: awk match

下面是我希望在匹配旁边的列中打印值的示例文件。

$> cat sample.txt
DATABASE ORACLE, DB_TYPE Relational, OS OEL 5
VERSION 12.2.0.1

DATABASE MongoDB, DB_TYPE NOSQL, OS RedHat 7
VERSION 3.2
DATABASE MySQL, DB_TYPE Relational
VERSION 5.5

以DATABASE和VERSION开头的行我加入了以下内容:

$> grep -i "^DATABASE\|^VERSION" sample.txt | sed 'N;s/,/\t/;s/\n/\t/'
DATABASE ORACLE  DB_TYPE Relational, OS OEL 5   VERSION 12.2.0.1
DATABASE MongoDB         DB_TYPE NOSQL, OS RedHat 7     VERSION 3.2
DATABASE MySQL   DB_TYPE Relational     VERSION 5.5

但是现在我想只打印DATABASE,DB_TYPE和VERSION旁边的列,我做了一些这样的事情。

$> grep -i "^DATABASE\|^VERSION" sample.txt | sed 'N;s/,/\t/;s/\n/\t/' |awk -v val1='DATABASE' -v val2='DB_TYPE' -v val3='VERSION' -F ' ' '{for (i=1; i<=NF; i++) if ($i==val1 || $i==val2 || $i==val3) {n=i+1; print $n} }' 
ORACLE
Relational,
12.2.0.1
MongoDB
NOSQL,
3.2
MySQL
Relational
5.5

但我期待这样的事情

ORACLE      Relational      12.2.0.1
MongoDB     NOSQL           3.2
MySQL       Relational      5.5

2 个答案:

答案 0 :(得分:2)

awk救援!

$ tr ',' '\n' <file | 
  awk '/DATABASE|DB_TYPE|VERSION/{printf "%s",$2 OFS; if(++c%3==0)print""}'

ORACLE Relational 12.2.0.1
MongoDB NOSQL 3.2
MySQL Relational 5.5

您可以将OFS设置为制表符或管道到column -t以进行表格格式化。

答案 1 :(得分:0)

对于您的示例,这将起作用: grep -i "^DATABASE\|^VERSION" sample.txt | sed 'N;s/,/\t/;s/\n/\t/' | awk 'BEGIN { OFS = " " } /DATABASE/ {print $2,$4,$NF}'

搜索DATABASE,输出文件分隔符(OFS)的出现位置 - 找出如何在特定操作系统的引号之间插入选项卡