AWK中管道的用法

9
我想要的是获取当前行的反转字符串,我尝试使用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个回答

7

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

4
尝试这个:
```awk '{ cmd="rev"; print $0 | cmd; close(cmd) }' myfile.txt```

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

从awk重定向到文件或命令并不会为每一行创建该文件或运行该进程,尽管有些人可能会这样认为:https://www.gnu.org/software/gawk/manual/html_node/Redirection.html。 - brablc

1
为什么不呢?
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

谢谢您的回复,我在Bash中已经测试通过了,很高兴知道awk可以设置空分隔符。 - Aidy

0
唯一的问题在于您的打印语句。请使用以下代码:

print "result=" result;

(result上不需要加$)


是的,在移除$符号后它成功了。为什么在print中使用$result会从文件获取内容呢? - Aidy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接