管在AWK用法(The usage of pipe in AWK)

2019-08-17 11:01发布

我想要的是得到当前行的逆转字符串,我试图在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这里是因为有一些其他进程做。

我错过了什么?

Answer 1:

系统功能允许用户执行操作系统命令,然后返回到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


Answer 2:

调用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


Answer 3:

试试这个:

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



Answer 4:

唯一的问题是你的print语句。 使用

print "result=" result;

(没有$result



Answer 5:

为什么不

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


文章来源: The usage of pipe in AWK
标签: awk pipe getline