2015-06-22 24 views
0

我有一個文件,其中我有手機號碼及其類別。不是所有的移動數量具有類別如需例如NF在awk函數

mobile123456678 
category1 
mobile345968483 
category2 
mobile956868483 
mobile958688504 
mobile958688438 
mobile058684838 
category4 
mobile238348459 
category5 
mobile958584939 
category6 

etc.etc

所以我有以下awk命令使用,它給所述移動號碼類別可用於其中。但我無法理解它是如何工作的

cat file | awk '{if ($0~/mobile/) {k=$NF;l=($NF-1)} else {print k,$0}}' 

mobile123456678 category1 
mobile345968483 category2 
mobile058684838 category4 

請讓我知道這是如何工作。

+0

爲什麼從未使用'l'? – 123

+1

切勿使用名爲'l'的變量,因爲它看起來太像數字'1'。你輸入的每一行有1個字段,所以NF總是1,所以你想在該腳本中做什麼。 –

回答

1

如果你願意打印其下一行的形式不是mobileXXX這些線路,你可以直接說:

$ awk '/^mobile/ {m=$NF; next} {print m, $0}' file 
mobile123456678 category1 
mobile345968483 category2 
mobile058684838 category4 
mobile238348459 category5 
mobile958584939 category6 

此檢查是否符合文本mobile開始,如果是這樣,商店在變量m的移動值(最後一個字段$NF *,根據您的輸入和代碼,儘管在這種情況下它也可以是$0)。然後,它移動到下一個記錄。

如果該行沒有以mobile開頭,則它將先前存儲的移動設備與當前行一起打印。

我只是建議是寫一個更地道的方式,你有什麼:

awk '{if ($0~/mobile/) {k=$NF;l=($NF-1)} else {print k,$0}}' file 

因爲if() {action} else {else_action}可以說condition {action; next} {else_action}避免。


*$NF指的是最後一個字段在給定的記錄,因爲NF表示爲第n個字段的字段$n數和。