在AWK中使用管道

时间:2013-03-11 11:17:05

标签: awk pipe getline

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

我错过了什么吗?

5 个答案:

答案 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