我有一个像这样的文件:
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更好的选择?
您可以取消设置记录分隔符,以便分别读取每个块,如下所示:
$ 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'
来完成。
您需要将该节作为单个记录读取,您可以通过使用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
更多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
—Edit—修改输入
$ 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