萌新求助!有关shell的一个小问题!

馒头也当菜 2020-10-30 03:54:00
问题出在之前找到的一个使用awk合并特征相同的行的教程里,以下链接:
http://blog.chinaunix.net/uid-10540984-id-3022733.html
主要问题在这:
awk '{if($1==x){i=i" "$2}else{if(NR>1){print i};i=$0};x=$1;y=$2}' file <(echo)
主要是后边<(echo)
在不加<(echo)情况下,最后一个i不会输出,也就是说这个 <(echo)代替了END{print i}的作用,后来又尝试<(ls)发现在输出结果里追加了ls的结果,明白了这是在输出结果末尾追加内容。
后来以为这个echo会将未print的变量都输出,但是试验了一下并不是这样。当最后同时存在之前输出用的i和新建立的b变量时,只会输出i。
b并没有输出。
所以这个 <(echo)具体原理是什么,一直没搞明白,有无大佬可以指点一二,谢谢!
...全文
16344 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰耳 2020-11-05
  • 打赏
  • 举报
回复
“<”是输入重定向,(echo)是一个命令组,"<(echo)"其作用等同于你在file文件中最后一行下边新加一行空行,目的是为了让awk输出最后的i。 以上命令等同于:
awk '{if($1==x){i=i" "$2}else{if(NR>1){print i};i=$0};x=$1}END{print i}' file
馒头也当菜 2020-11-05
  • 打赏
  • 举报
回复
引用 3 楼 丰耳的回复:
前面的awk命令最后一行匹配的是if,后面没有行了,所以最后一行不会输出,加了<(echo)后,又往后轮询一次到else,会输出i 具体你打印出整个执行过程就明白了:
awk '{if($1==x){i=i" "$2;print "if----",NR,"i=("i")"}else{if(NR>1){print "else--",NR,"i=("i")"};i=$0};x=$1;print "step--",NR,"i=("i")","-------------x=("x")"}' file <(echo)
这个awk语句的逻辑就是if不print(即$1相同不输出),else才print,(即当前行的$1跟上一行$1不同,则输出已组装的i)
明白了,万分感谢!这个问题困扰了好久了
丰耳 2020-11-05
  • 打赏
  • 举报
回复
前面的awk命令最后一行匹配的是if,后面没有行了,所以最后一行不会输出,加了<(echo)后,又往后轮询一次到else,会输出i 具体你打印出整个执行过程就明白了:
awk '{if($1==x){i=i" "$2;print "if----",NR,"i=("i")"}else{if(NR>1){print "else--",NR,"i=("i")"};i=$0};x=$1;print "step--",NR,"i=("i")","-------------x=("x")"}' file <(echo)
这个awk语句的逻辑就是if不print(即$1相同不输出),else才print,(即当前行的$1跟上一行$1不同,则输出已组装的i)
馒头也当菜 2020-11-05
  • 打赏
  • 举报
回复
引用 1 楼 丰耳的回复:
“<”是输入重定向,(echo)是一个命令组,"<(echo)"其作用等同于你在file文件中最后一行下边新加一行空行,目的是为了让awk输出最后的i。 以上命令等同于:
awk '{if($1==x){i=i" "$2}else{if(NR>1){print i};i=$0};x=$1}END{print i}' file
感谢回复!但是这个<(echo)只是添加了一行空行吧,前边awk执行完以后最后一行不会输出,那么这里的最后一行的输出是怎么实现的呢?

427

社区成员

发帖
与我相关
我的任务
社区描述
非技术问题的乐园
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧