2017-09-05 92 views
0

的n個我有一個文本文件是這樣的:AWK集團通過後線

lqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqk 
xtable_name  xcolumn_name  xother_info x 
tqqqqqqqqqqqqqqqqqqnqqqqqqqqqqqqqqqqqnqqqqqqqqqqqqqu 
xqs_tab1   xcol01   xblahblah01 x 
xqs_tab1   xcol02   xblahblah02 x 
xqs_tab1   xcol03   xblahblah03 x 
xqs_tab2   xcol09   xblahblah04 x 
xqs_tab2   xcol01   xblahblah05 x 
xqs_tab2   xcol02   xblahblah06 x 
xqs_tab2   xcol03   xblahblah07 x 
xqs_tab2   xcol04   xblahblah08 x 
xqs_tab2   xcol05   xblahblah09 x 
xqs_tab2   xcol06   xblahblah10 x 
xqs_tab3   xcol01   xblahblah11 x 
xqs_tab3   xcol02   xblahblah12 x 
mqqqqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqqqvqqqqqqqqqqqqqj 

我想獲得列的數量在每個表是這樣的:

qs_tab1, 3 
qs_tab2, 7 
qs_tab3, 2 

看了在這個論壇上有類似的問題,我創建了以下腳本:

#!/bin/sh 
awk ' 
BEGIN { FS=" x";} 
{ 
    tablename[$1]++; 
} 
END { for (i in tablename) { 
     print tablename[i], i; 
     } 
} 
' 

這使我獲得最多的方式,但我想錯過前3行和最後一行。

我曾嘗試在各處放置if (NR > 3)類型的語句,但我總是收到錯誤。

我還想避免每行中的第一個"x" - 但這不是一個問題。

回答

2

你希望把你的條件(收費)的代碼被添加到陣列tablename[]塊的前面:

#!/bin/sh 
awk ' 
BEGIN { FS=" x"; } 
NR > 3 { tablename[$1]++; } 
END { for (i in tablename) { 
     print tablename[i], i; 
     } 
} 
' 

這將跳過第3行。跳過最後一個並不是那麼簡單。爲此,我們創建一個新變量來保存我們添加到數組中的值直到下一條記錄。然後,當我們到達最後一行時,腳本結束,最後一行不會碰到數組。你可以認爲它像一個緩衝區,而這也是我的名字這個變量,但是在這裏我將它命名爲「firstfield」,因爲它似乎是恰當的:

#!/bin/sh 
awk ' 
BEGIN { FS=" x" } 
NR > 4 { tablename[firstfield]++ } 
NR > 3 { firstfield=$1 } 
END { for (i in tablename) { 
     print tablename[i], i; 
     } 
} 
' 

現在我們有firstfield變量被設置,但直到awk的下一個迭代/記錄/行才被使用,從而有效地跳過最後一行。