我们经常会在awk中使用shell命令,或者是将AWK处理的字段例如$1,$2等进行处理,这种情况应该怎么在AWK中高效的实现呢?
1、如果我们想在AWK中使用shell命令的话,可以使用AWK中的system函数,此函数可以帮我们将想要执行的命令直接当shell命令来执行。
example
cat file
日期 卡号 姓名
2016 123 张三
2016 234 李武
2019 222 老李
awk'NR>1{system("echo hello")}1' file
日期 卡号 姓名
hello
2016 123 张三
hello
2016 234 李武
hello
2019 222 老李
上面的情况完全可以实现,但是如果我们要引用某个变量来进行操作的话,这种方法好像不太好实现
awk'NR>1{system("echo $2")}1' file
日期 卡号 姓名
2016 123 张三
2016 234 李武
2019 222 老李
此时输出的$2是空值
awk'NR>1{cmd="echo "$2"";cmd | getline b;print b}1' file
cmd | getline b代表的是将cmd通过管道输出给getline,然后在给变量b,这种方法可以实现赋值,另外还可以实现的方法是输入重定向
cat a
220 34 50 70
553 556 32 21
1 1 14 98 33
cat b
10
8
2
要求文件a的每行数据和文件b的相应的行的值相减,得到其绝对值
awk '{getlinej<"b";for(i=1;i<=NF;i++){$i>j?$i=$i-j:$i=j-$i}}1' a
此处的重定向代表的是将b中每行的数据赋值给b,然后就行操作
所以如果要进行赋值的话,如果是命令的话需要使用的是 cmd | getline var_name,如果是直接对文本中的行进行赋值的话 getlinevar<”file_name”,
具体的例子可以参考上面的两个example。