使用awk将文件分割成列



我有一个像这样的文件:

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

相关内容

  • 没有找到相关文章

最新更新