如何用comm结合awk/sed实现单命令行提取两输入流的独有行?
解决ConEmu中comm结合awk/sed的命令报错问题
我之前在ConEmu里折腾类似命令的时候也踩过这个坑!你遇到的“系统找不到指定文件”错误,根源在于Windows默认的cmd/PowerShell不支持Unix shell里的进程替换语法——你用(command)作为comm的输入参数,shell会误以为这是一个要打开的文件名,而不是把命令的输出当作输入流。
下面给你两种不用临时文件的单行解决方案,适配不同的ConEmu环境:
方案1:用Git Bash/WSL Bash的进程替换(推荐,符合你用comm的需求)
如果你的ConEmu已经配置了Git Bash或者WSL Bash作为可用shell,直接切换到对应标签页,把括号改成<(...)语法即可:
comm -23 <(git branch -r | awk -F"/" '/matchingstring/{print $2}' | sort) <(other_command | sort)
<(command)会让shell创建一个伪文件,把命令的输出写入其中,comm就能像读取普通文件一样读取两个输入流了comm -23的作用就是只保留仅在第一个输入中存在的行,正好符合你的需求
方案2:不用comm,直接用awk实现需求(适配cmd/PowerShell)
如果不想切换shell,或者环境里没有bash,用awk就能直接实现comm -23的功能,单行命令搞定:
针对PowerShell:
Compare-Object (git branch -r | awk -F"/" '/matchingstring/{print $2}' | sort) (other_command | sort) -PassThru | Where-Object { $_.SideIndicator -eq "<=" }
针对cmd(需要awk可用,比如Git自带的awk):
awk "NR==FNR{a[\$0];next}!(\$0 in a)" <(other_command | sort) <(git branch -r | awk -F"/" "/matchingstring/{print \$2}" | sort)
验证你的示例
用你的测试输入来验证:
- 第一个流输出:
matchingstring-234、matchingstring-456 - 第二个流输出:
matchingstring-123、matchingstring-345、matchingstring-456
不管用上面哪种方案,最终都会输出matchingstring-234,完全符合预期。
内容的提问来源于stack exchange,提问作者Miklos Jakab
相关产品推荐
相关产品推荐

