2015-03-03 55 views
0

我有一个文件,我想要使用空格或“_”来分割其行。Awk空格分隔的文件内容

它的格式是

f 5.287102213 _10_ RTR --- 312 cbr 120 [13a a 6 800] ------- [6:0 20:0 29 20] [15] 1 0 

s 5.288000000 _0_ AGT --- 322 cbr 100 [0 0 0 0] ------- [0:0 2:0 32 0] [18] 

我awk脚本如下:

`#!/usr/bin/awk -f 

BEGIN {FS="[[:space:]]|_"} # use posix space or underscore for FS 

{ 
action = $1; 
time = $2; 
sta = $4 ; # shifted here because underscores are delimiters 
dest = $6; 
app = $10; 
pkt_size = $11; 

#print $1 
#print $2 
print $5 
#print $4 
#print $5 
#print $6 
#print $7 
#print $8 
#print $9 
#print $10 

if(action == "s" && dest == "MAC" && app == "cbr"){ 
      startTime+=time ; 
     count++;   
} 

if(action == "r" && dest == "MAC" && app == "cbr"){ 
      endTime+=time ; 
     receivedSize+=pkt_size ;    
    } 


}` 

可以看出在上面的脚本,从上面的脚本我期待RTR是在$ 4。 但我发现的$ 3的输出如下:

RTR --- 312 cbr 120 [13a a 6 800] ------- [6:0 20:0 29 20] [15] 1 0 
AGT --- 322 cbr 100 [0 0 0 0] ------- [0:0 2:0 32 0] [18] 0 0 

RTR --- 322 cbr 100 [0 0 0 0] ------- [0:0 2:0 32 0] [18] 0 0 

我在做什么错?对awk来说是新的。

+1

很抱歉,我不力将其标记早期正确的。 – 2015-05-21 08:56:10

回答

2

FS的值更改为[[:space:]_]+以获得所需的标记化(拆分为字段)。

这种说法进行测试,看看该领域公认的:

awk -F'[[:space:]_]+' '{for(i=1;i<=NF;++i){print i ": " $i}}' \ 
    <<<'f 5.287102213 _10_ RTR --- 312 cbr 120 [13a a 6 800] ------- [6:0 20:0 29 20] [15] 1 0' 

FS值,[[:space:]]|_的问题,是

  • 它只能识别在字符一个时间作为分隔符
  • 它只能识别或者空白_作为分隔符。

注意,指定比' '其他显式FS值(单个空格)导致AWK寻找该分离器的单个实例,并解释多个相邻实例作为分离多 - 从而 - 领域。

因此,在你的情况下,该跨距<space>__<space>各自表示不是一个单一的分离器,但两个隔板抵靠的字段。

如果你想跨越从一组给定的字符或字符(运行)被解释为一个单一分离例如,使用重复符号+

不过建议FS值,[[:space:]_]+,可能是过于宽松,因为它会承认空白和_字符的任意组合运行。作为分隔符。

了更多限制,你可以使用下面的FS值:

[[:space:]]+_?|_?[[:space:]]+ 

这就是说,如果_字符在你输入功能更像定界符仅包围一个字段,更好的解决方案可能是:

  • 使用DEFAULT值FS,其中确认运行空白作为分隔符
  • 从外地$3剥离_分隔符:gsub("^_|_$", "", $3)