我想要的是获取当前行的反向字符串,我尝试在AWK中使用rev命令但无法获得当前结果。
$ 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'
这样的反向字符串。在这里使用AWK是因为还有其他一些过程要做。
我错过了什么吗?
答案 0 :(得分:5)
系统功能允许用户执行操作系统命令,然后返回awk程序。系统函数执行string命令给出的命令。它返回由执行的命令返回的状态作为其值。
$ 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
答案 1 :(得分:1)
从awk调用rev
命令效率非常低,因为它为每个处理的行创建一个子进程。我认为你应该在awk中定义一个rev
函数:
$ 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
答案 2 :(得分:0)
唯一的问题是你的print语句。使用
print "result=" result;
($
上的result
}
答案 3 :(得分:0)
为什么不
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
答案 4 :(得分:0)
试试这个:
awk '{ cmd="rev"; print $0 | cmd; close(cmd) }' myfile.txt