2015-03-03 82 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)