使用awk将文件拆分为列

时间:2015-06-08 09:23:30

标签: bash file awk multiple-columns

我有一个看起来像这样的文件:

1. result = 1.2.3.4 (1.2.3.4)
   info: [Affected]

2. result = www.addr.com (2.3.4.5)
   info: [not Affected]

现在我想把它分成三列,例如:

1.2.3.4       1.2.3.4   Affected
www.addr.de   2.3.4.5   not Affected

我正在使用awk:cat filename.txt | awk -F "[=()'']" '{print $2 $3 $4}'

但我仍然没有连续三​​列。我该如何解决?第二个问题:有没有比awk更好的选择?

3 个答案:

答案 0 :(得分:4)

您可以取消设置记录分隔符以分别读取每个块,如下所示:

$ cat file
1. result = 1.2.3.4 (1.2.3.4)
   info: [Affected]

2. result = www.addr.com (2.3.4.5)
   info: [not Affected]
$ awk -F'[]=():[:space:][]+' -v RS= '{print $3, $4, $6 (NF==8?" " $7:"")}' file
1.2.3.4 1.2.3.4 Affected
www.addr.com 2.3.4.5 not Affected

末尾的三元组处理两个不同数量的字段(7或8,取决于“受影响”或“未受影响”)。如果有8个字段,则在空格后打印第7个字段,否则不打印任何字段。

要获得更整洁的格式化输出,您可以使用printf代替print

$ awk -F'[]=():[:space:][]+' -v RS= '{printf "%-12s%10s   %s%s%s", $3, $4, $6, (NF==8?" " $7:""), ORS}' file
1.2.3.4        1.2.3.4   Affected
www.addr.com   2.3.4.5   not Affected

格式说明符指示每个字段的宽度。 -导致内容左对齐。 ORS是输出记录分隔符,默认情况下是您平台上的换行符。

在对齐列方面,取决于您是在寻找人类还是机器可读的东西。如果您要将此数据导入电子表格,也许您可​​以使用制表符\t(例如)分隔每个列,这可以通过将-v OFS='\t'添加到我的第一个版本来完成答案。

答案 1 :(得分:3)

您需要将该部分作为单个记录阅读,您可以使用RS=(无)在GAWK中执行此操作。这会将块作为记录读取。

awk -vRS= -F"[)(=\n]+" '{print $2 $3 $4}' file

1.2.3.4 1.2.3.4   Affected
www.addr.com 2.3.4.5   not Affected

答案 2 :(得分:1)

更多awk

输入

$ cat file
1. result = 1.2.3.4 (1.2.3.4)
   Affected

2. result = www.addr.com (2.3.4.5)
   not Affected

<强>输出

$ awk  's{print $0}s=/^[0-9]+\./{ gsub(/[()]/,"");printf ("%s %s", $4,$5);next}' file
1.2.3.4 1.2.3.4   Affected
www.addr.com 2.3.4.5   not Affected

- 编辑 - 修改输入

$ cat file
1. result = 1.2.3.4 (1.2.3.4)
   info: [Affected]

2. result = www.addr.com (2.3.4.5)
   info: [not Affected]

<强>输出

$ awk  '{gsub(/[()\[\]]/,"")}s{$1="";print $0}s=/^[0-9]+\./{printf ("%s %s", $4,$5);next}' file
1.2.3.4 1.2.3.4 Affected
www.addr.com 2.3.4.5 not Affected