awk -F,FS,OFS,$NF 的使用

本文是在网上看到,觉得挺有意思,特地拿下来写个自己的理解,方便初学者理解,虽然没啥用,不过重点在思路。

NF 为最后一个字段的字段数。

下面几个例子的作用都一样 都是得到这样一个输出结果,即去掉后缀 .tar.Z

源字符串:AIX.PI6002.090316.tar.Z

结果字符串:AIX PI6002 090316

单独解释:以“.”为分隔符,把最后1个字段 和倒数第2个字段 赋值为空, 再输出整个字段

echo AIX.PI6002.090316.tar.Z | awk -F "." '{$NF="";$(NF-1)=""}{print $0}'

单独解释:以“.”为分隔符,输出前三个字段

echo "xxx.xxxx.xxxx.tar.bz" | awk -F. '{print $1"."$2"."$3}'

单独解释:以“.”为分隔符,把NF的值减去2,即5-2=3  

echo AIX.PI6002.090316.tar.Z | awk -F . 'NF-=2' 

单独解释:以“.”为分隔符,把NF赋值为NF-2

echo AIX.PI6002.090316.tar.Z  | awk 'NF=NF-2' FS=.  

单独解释:以“.”为分隔符把NF的值减去2输出的分隔符为" "  

echo AIX.PI6002.090316.tar.Z  | awk 'NF-=2' FS=. OFS=" "

下面输出结果为:AIX.PI6002.090316

单独解释:以“.”为分隔符,把NF的值减去2,同时把分隔符通过sed替换 空格 " "   "." 

echo "AIX.PI6002.090316.tar.bz" | awk -F . 'NF-=2' | sed 's/ /./g'

单独解释:以“.”为分隔符,通过for循环输出NF-2之前的字段,利用 printf 的结果输出没有换行符,通过print输出第NF-2个字段,print输出结果有换行符,如此拼出结果。 

echo AIX.PI6002.090316.tar.Z | awk -F "." '{for (i=1;i<NF-2;i++) printf $i".";print $(NF-2)}'

单独解释:一整个字段为字符串,然后从第一个字符开始到第三个字段的最后个字符。(match会返回一个数值)

echo AIX.PI6002.090316.tar.Z | awk '{print substr($0,1,match($0,/\.[^\.]+\.[^\.]+$/)-1)}'


你可能感兴趣的:(awk)