精通awk系列(13):print、printf、sprintf和重定向



回到:


输出操作

awk可以通过print、printf将数据输出到标准输出或重定向到文件。

print

print elem1,elem2,elem3...
print(elem1,elem2,elem3...)

逗号分隔要打印的字段列表,各字段都会自动转换成字符串格式,然后通过预定义变量OFS(output field separator)的值(其默认值为空格)连接各字段进行输出。

$ awk 'BEGIN{print "hello","world"}'
hello world
$ awk 'BEGIN{OFS="-";print "hello","world"}'
hello-world

print要输出的数据称为输出记录,在print输出时会自动在尾部加上输出记录分隔符,输出记录分隔符的预定义变量为ORS,其默认值为\n

$ awk 'BEGIN{OFS="-";ORS="_\n";print "hello","world"}'
hello-world_

括号可省略,但如果要打印的元素中包含了特殊符号>,则必须使用括号包围(如print("a" > "A")),因为它是输出重定向符号。

如果省略参数,即print;等价于print $0;

print输出数值

print在输出数据时,总是会先转换成字符串再输出。

对于数值而言,可以自定义转换成字符串的格式,例如使用sprintf()进行格式化。

print在自动转换数值(专指小数)为字符串的时候,采用预定义变量OFMT(Output format)定义的格式按照sprintf()相同的方式进行格式化。OFMT默认值为%.6g,表示有效位(整数部分加小数部分)最多为6。

$ awk 'BEGIN{print 3.12432623}'
3.12433

可以修改OFMT,来自定义数值转换为字符串时的格式:

$ awk 'BEGIN{OFMT="%.2f";print 3.99989}'
4.00

# 格式化为整数
$ awk 'BEGIN{OFMT="%d";print 3.99989}'
3
$ awk 'BEGIN{OFMT="%.0f";print 3.99989}'
4

printf

printf format, item1, item2, ...

格式化字符:

修饰符:均放在格式化字符的前面

N$      N是正整数。默认情况下,printf的字段列表顺序和格式化字符
        串中的%号顺序是一一对应的,使用N$可以自行指定顺序。
        printf "%2$s %1$s","world","hello"输出hello world
        N$可以重复指定,例如"%1$s %1$s"将取两次第一个字段

宽度     指定该字段占用的字符数量,不足宽度默认使用空格填充,超出宽度将无视。
         printf "%5s","ni"输出"___ni",下划线表示空格

-       表示左对齐。默认是右对齐的。
        printf "%5s","ni"输出"___ni"
        printf "%-5s","ni"输出"ni___"

空格     针对于数值。对于正数,在其前添加一个空格,对于负数,无视
        printf "% d,% d",3,-2输出"_3,-2",下划线表示空格

+       针对于数值。对于正数,在其前添加一个+号,对于负数,无视
        printf "%+d,%+d",3,-2输出"+3,-2",下划线表示空格

#       可变的数值前缀。对于%o,将添加前缀0,对于%x或%X,将添加前缀0x或0X

0       只对数值有效。使用0而非默认的空格填充在左边,对于左对齐的数值无效
        printf "%05d","3"输出00003
        printf "%-05d","3"输出3
        printf "%05s",3输出____3

'       单引号,表示对数值加上千分位逗号,只对支持千分位表示的locale有效
        $ awk "BEGIN{printf \"%'d\n\",123457890}"
        123,457,890
        $ LC_ALL=C awk "BEGIN{printf \"%'d\n\",123457890}"
        123457890

.prec   指定精度。在不同格式化字符下,精度含义不同
        %d,%i,%o,%u,%x,%X 的精度表示最大数字字符数量
        %e,%E,%f,%F 的精度表示小数点后几位数
        %s 的精度表示最长字符数量,printf "%.3s","foob"输出foo
        %g,%G 的精度表示表示最大有效位数,即整数加小数位的总数量

sprintf()

sprintf()采用和printf相同的方式格式化字符串,但是它不会输出格式化后的字符串,而是返回格式化后的字符串。所以,可以将格式化后的字符串赋值给某个变量。

awk '
    BEGIN{
        a = sprintf("%03d", 12.34)
        print a  # 012
    }
'

重定向输出

print[f] something >"filename"
print[f] something >>"filename"
print[f] something | "Shell_Cmd"
print[f] something |& "Shell_Cmd_Coprocess"

>filename时,如果文件不存在,则创建,如果文件存在则首先截断。之后再输出到该文件时将不再截断。

awk中只要不close(),任何文件都只会在第一次使用时打开,之后都不会再重新打开。

awk '{print $2 >"name.txt";print $4 >"name.txt"}' a.txt

>>filename时,将追加数据,文件不存在时则创建。

print[f] something | Shell_Cmd时,awk将创建一个管道,然后启动Shell命令,print[f]产生的数据放入管道,而命令将从管道中读取数据。

# 例1:
awk '
    NR>1{
      print $2 >"name.unsort"
      cmd = "sort >name.sort"
      print $2 | cmd
      #print $2 | "sort >name.sort"
    }
    END{close(cmd)}
' a.txt

# 例2:awk中构建Shell命令,通过管道交给shell执行
awk 'BEGIN{printf "seq 1 5" | "bash"}'

print[f] something |& Shell_Cmd时,print[f]产生的数据交给Coprocess。之后,awk再从Coprocess中取回数据。这里的|&有点类似于能够让Shell_Cmd后台异步运行的管道。

stdin、stdout、stderr

awk重定向时可以直接使用/dev/stdin/dev/stdout/dev/stderr。还可以直接使用某个已打开的文件描述符/dev/fd/N

例如:

awk 'BEGIN{print "something OK" > "/dev/stdout"}'
awk 'BEGIN{print "something wrong" > "/dev/stderr"}'
awk 'BEGIN{print "something wrong" | "cat >&2"}'

awk 'BEGIN{getline < "/dev/stdin";print $0}'

$ exec 4<> a.txt
$ awk 'BEGIN{while((getline < "/dev/fd/4")>0){print $0}}'

原文地址:https://www.cnblogs.com/f-ck-need-u/p/12005584.html

时间: 2024-10-08 04:01:15

精通awk系列(13):print、printf、sprintf和重定向的相关文章

PHP基础温习之echo print printf sprintf print_r var_dump的用法与区别

原文:PHP基础温习之echo print printf sprintf print_r var_dump的用法与区别 一.echoecho() 实际上不是一个函数,是php语句,因此您无需对其使用括号.不过,如果您希望向 echo() 传递一个以上的参数,那么使用括号会发生解析错误.而且echo是返回void的,并不返回值,所以不能使用它来赋值.例子: 复制代码代码如下: <?php $a = echo("55nav"); // 错误!不能用来赋值 echo "55n

PHP输出函数print, printf, sprintf的区别

PHP中常用的字符串输出方式是:使用echo和print两种方法来显示字符串.如果涉及格式化输出操作,还可以试用printf和sprintf函数. 一.先说echo和print两种方法 print的语法格式为:int print ( string $arg   ) echo的语法格式为:void echo ( string $arg1   [, string $...  ] ) echo都是一种类似于函数的输出方式而非函数,没有返回值,且支持多参数: print是输出函数,其返回值为int类型的

精通awk系列(15):awk数据类型和字面量

回到: Linux系列文章 Shell系列文章 Awk系列文章 数据类型 gawk有两种基本的数据类型:数值和字符串.在gawk 4.2.0版本中,还支持第三种基本的数据类型:正则表达式类型. 数据是什么类型在使用它的上下文中决定:在字符串操作环境下将转换为字符串,在数值操作环境下将转换为数值.这和自然语言中的一个词语.一个单词在不同句子内的不同语义是一样的. 隐式转换: 算术加0操作可转换为数值类型 "123" + 0返回数值123 " 123abc" + 0转换

精通awk系列(16):gawk支持的正则表达式

回到: Linux系列文章 Shell系列文章 Awk系列文章 gawk支持的正则 . # 匹配任意字符,包括换行符 ^ $ [...] [^...] | + * ? () {m} {m,} {m,n} {,n} [:lower:] [:upper:] [:alpha:] [:digit:] [:alnum:] [:xdigit:] [:blank:] [:space:] [:punct:] [:graph:] [:print:] [:cntrl:] 以下是gawk支持的: \y 匹配单词左右边

精通awk系列(14):细说awk中的变量和变量赋值

回到: Linux系列文章 Shell系列文章 Awk系列文章 awk变量 awk的变量是动态变量,在使用时声明. 所以awk变量有3种状态: 未声明状态:称为untyped类型 引用过但未赋值状态:unassigned类型 已赋值状态 引用未赋值的变量,其默认初始值为空字符串或数值0. 在awk中未声明的变量称为untyped,声明了但未赋值(只要引用了就声明了)的变量其类型为unassigned. gawk 4.2版提供了typeof()函数,可以测试变量的数据类型,包括测试变量是否声明.

精通awk系列(19):awk流程控制之break、continue、next、nextfile、exit语句

回到: Linux系列文章 Shell系列文章 Awk系列文章 break和continue break可退出for.while.do...while.switch语句. continue可让for.while.do...while进入下一轮循环. awk ' BEGIN{ for(i=0;i<10;i++){ if(i==5){ break } print(i) } # continue for(i=0;i<10;i++){ if(i==5)continue print(i) } }' ne

精通awk系列(18):awk流程控制之if、while、switch、for语句

回到: Linux系列文章 Shell系列文章 Awk系列文章 流程控制语句 注:awk中语句块没有作用域,都是全局变量. if (condition) statement [ else statement ] expr1?expr2:expr3 while (condition) statement do statement while (condition) for (expr1; expr2; expr3) statement for (var in array) statement br

PHP echo, print, printf, sprintf函数的区别和使用

1. echo函数: 输出函数,是命令,不能返回值.echo后面可以跟很多个参数,之间用分号隔开,如: echo $myvar1; echo 1,2,$myvar,"<b>bold</b>"; 2. print函数: 是函数,可以返回一个值,只能有一个参数. int print ( string arg ) Outputs arg . Returns 1 ,  always. 3. printf函数: int printf ( string format [,

echo print printf sprintf print_r var_dump的用法与区别

一.echoecho() 实际上不是一个函数,是php语句,因此您无需对其使用括号.不过,如果您希望向 echo() 传递一个以上的参数,那么使用括号会发生解析错误.而且echo是返回void的,并不返回值,所以不能使用它来赋值.例子: 复制代码代码如下: <?php $a = echo("55nav"); // 错误!不能用来赋值 echo "55nav"; // 55nav echo ("55nav"); // 55nav echo (