使用awk进行小数运算及其他案例

发布时间 2023-03-24 10:40:04作者: 草原悍匪

1、将mysql的字段类型替换成其他数据库的字段类型,本案例中其他数据库类型为SequoiaDB:

mysql -h localhost  -u admin -padmin -e "describe $tableName" | awk '{
      if(NR!=1){ 
        fname=$1
        ftype=$2
        gsub(/varchar.*|char.*/,"string",ftype) 
        gsub(/longtext/,"string",ftype)
        gsub(/text/,"string",ftype)
        gsub(/bigint.*/,"long",ftype)        
        gsub(/int.*/,"int",ftype)
        gsub(/float.*/,"double",ftype)
        gsub(/datetime.*/,"string",ftype)
        gsub(/timestamp.*/,"timestamp",ftype)
        gsub(/tinyint.*/,"int",ftype)      
        print fname,ftype
       }
    }'
   #(1)
   #NR是awk中的内置变量,记录文件的行号,从1开始。新文件不从1开始。类似的内置变量如下:
   #NF:字段个数
   #FNR:记录文件的行号,从1开始。新文件也从1开始。
   #FS:输入字段分隔符,默认为空格。
   #OFS:输出字段分隔符,默认为空格。
   #(2)
   #其中varchar.*的含义是:匹配以varchar开头的,后面0个或多个任意字符串。换行符除外。
   #(3)
   #sub匹配第一次出现的符合模式的字符串,相当于 sed 's//'   
   #gsub匹配所有的符合模式的字符串,相当于 sed 's//g'

2、awk -F以指定分隔符将文件分割成若干列:

awk -F, '{print $1,$2}'   log.txt #以逗号分割,并打印第一列和第二列
#cut命令同样可以实现上述功能,实现方式如下
cut -d "," -f 1,2

3、输出第一列大于2且第二列等于2的行:

awk '$1>2 && $2=="2" {print $1,$2,$3}' a.txt

4、输出第一列包含指定字符串的行:

awk '$1 ~ /匹配字符串/' test.sh
awk 'BEGIN{IGNORECASE=1} /匹配字符串/' log.txt #忽略大小写匹配

5、使用awk进行小数运算:

a=1.23123
b=2.03251
c=$(echo "${a} ${b}" | awk '{printf("%.2f",'${a}'+'${b}') }')
echo $c