行列转换实现方式(SHELL)

1.AWK 命令的实现方式


seq 10 | awk 'ORS=NR%2?"\t\t":"\n"'
echo "abc" | awk '{ OFS="." } { NF=NF; print NF,$0}'

2.xargs -n参数也可实现 (但部分条件下会有限制)


seq  10 |xargs -n 2 

扩展:

一:awk中调用shell命令:

awk中的管道概念和shell的管道类似,都是使用”|”符号。如果在awk程序中打开了管道,必须先关闭该管道才能打开另一个管道。也就是说一次只能打开一个管道。shell命令必须被双引号引用起来。“如果打算再次在awk程序中使用某个文件或管道进行读写,则可能要先关闭程序,因为其中的管道会保持打开状态直至脚本运行结束。注意,管道一旦被打开,就会保持打开状态直至awk退出。因此END块中的语句也会收到管道的影响。(可以在END的第一行关闭管道)”

awk中使用管道有两种语法,分别是:


awk output | shell input
shell output | awk input

对于awk output | shell input来说,shell接收awk的输出,并进行处理。需要注意的是,awk的output是先缓存在pipe中,等输出完毕后再调用shell命令 处理,shell命令只处理一次,而且处理的时机是“awk程序结束时,或者管道关闭时(需要显式的关闭管道)”


$awk '/west/{count++} {printf "%s %s\t\t%-15s\n", $3,$4,$1 | "sort +1"} END{close "sort +1"; printf "The number of sales pers in the western"; printf "region is " count "." }' datafile 

(解释:/west/{count++}表示与“wes”t进行匹配,若匹配,则count自增)

printf函数用于将输出格式化并发送给管道。所有输出集齐后,被一同发送给sort命令。必须用与打开时完全相同的命令来关闭管道(sort +1),否则END块中的语句将与前面的输出一起被排序。此处的sort命令只执行一次。

在shell output | awk input中awk的input只能是getline函数。shell执行的结果缓存于pipe中,再传送给awk处理,如果有多行数据,awk的getline命令可能调用多次。


$awk 'BEGIN{ while(("ls" | getline d) > 0) print d}' f

二:awk结合match使用,提取匹配字符串:

文件内容:

hostname

0.0.0.0

要求提取0.0.0.0

命令:


cat filename | grep -A 1 "hostname" |awk 'match($0, "(.*)", a) {print a[1]}'

其中 grep -A n,表示多往下输出n行

发表回复