我有一个看起来像这样的文件:
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更好的选择?
答案 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