在awk函数中的NF

时间:2015-06-22 11:15:48

标签: 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

请告诉我这是如何运作的。

1 个答案:

答案 0 :(得分: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个字段。