7

我想要的是获取当前行的反转字符串,我尝试在 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 是因为还有一些其他的流程要做。

我错过了什么吗?

4

5 回答 5

5

system 函数允许用户执行操作系统命令,然后返回到 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
于 2013-03-11T11:32:27.907 回答
4

尝试这个:

awk '{ cmd="rev"; print $0 | cmd; close(cmd) }' myfile.txt

于 2013-11-05T07:05:27.950 回答
1

从 awk调用rev命令效率非常低,因为它为处理的每一行创建一个子进程。我认为你应该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
于 2013-03-11T13:51:45.127 回答
0

唯一的问题是您的打印语句。利用

print "result=" result;

(不$result

于 2013-03-11T12:37:34.110 回答
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
于 2013-03-11T16:15:31.013 回答