我想要的是得到当前行的逆转字符串,我试图在AWK使用转命令,但不能获得当前的结果。
$ cat myfile.txt
abcde
$ cat myfile.txt | awk '{cmd="echo "$0"|rev"; cmd | getline result; print "result="$result; close(cmd);}'
abcde
我想edcba
输出。
我知道有一些其他的方式来获得反向字符串像$ cat myfile.txt | exec 'rev'
$ cat myfile.txt | exec 'rev'
。 使用AWK这里是因为有一些其他进程做。
我错过了什么?
系统功能允许用户执行操作系统命令,然后返回到awk程序。 该系统功能执行由字符串命令给出的命令。 它返回,因为它的价值,由被执行的命令返回的状态。
$ cat file
abcde
$ rev file
edcba
$ awk '{system("echo "$0"|rev")}' file
edcba
# Or using a 'here string'
$ awk '{system("rev<<<"$0)}' file
edcba
$ awk '{printf "Result: ";system("echo "$0"|rev")}' file
Result: edcba
# Or using a 'here string'
$ awk '{printf "Result: ";system("rev<<<"$0)}' file
Result: edcba
调用rev
从awk命令是非常低效的,因为它创建用于处理的每个线的子过程。 我想你应该定义一个rev
在awk的功能:
$ cat myfile.txt | awk 'function rev(str) {
nstr = ""
for(i = 1; i <= length(str); i++) {
nstr = substr(str,i,1) nstr
}
return nstr
}
{print rev($0)}'
edcba
试试这个:
awk '{ cmd="rev"; print $0 | cmd; close(cmd) }' myfile.txt
为什么不
awk '{print "result =",$0}' <(rev file)
或者,如果你不使用bash
/ ksh93
:
rev file | awk '{print "result =",$0}'
---
或者,如果你的awk支持空FS选项:
awk '{res=x; for(i=NF; i>=1; i--) res=res $i; print res}' FS= file