我想使用comm
打印出仅存在于两个输入流之一中的所有行(尽管使用此命令不是必需的)。但是,使用awk
或sed
似乎有点搞砸了。例如。 comm -23 (git branch -r | awk -F\"[/]\" '/matchinstring/{print $2}' | sort) (blah blah other stream)
失败("系统无法找到指定的文件。")。 awk
尝试使用| sort...
部分。有办法克服这个问题吗?当然,我可以输出2个文件,而不是在这两个文件上使用comm
,但是我可以将它作为单行吗?我使用的是ConEmu。
示例输入1:
matchingstring-234
matchingstring-456
示例输入2:
matchingstring-123
matchingstring-345
matchingstring-456
预期产出:
matchingstring-234
答案 0 :(得分:2)
输入文件:
$ cat f1
matchingstring-234
matchingstring-456
$ cat f2
matchingstring-123
matchingstring-345
matchingstring-456
使用awk
$ awk 'FNR==NR{arr[$1];next}!( $1 in arr)' f2 f1
matchingstring-234
使用grep
$ grep -v -F -x -f f2 f1
matchingstring-234
使用加入
$ join -v 2 <(sort f2) <(sort f1)
matchingstring-234
来自人
grep
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings (instead of regular
expressions), separated by newlines, any of which is to be
matched.
-x, --line-regexp
Select only those matches that exactly match the whole line.
For a regular expression pattern, this is like parenthesizing
the pattern and then surrounding it with ^ and $.
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing. Multiple
-f can be used to specify different files.
答案 1 :(得分:1)
由于您使用的是bash(基于您的代码),因此您可以使用process substitution:
~> comm -23 <(echo a; echo b) <(echo b; echo c)
a
例如:
1.123456789012345
答案 2 :(得分:0)
事实证明答案取决于您使用的shell。
正如@HardcoreHenry和@shellter提到的bash和ksh(93),你可以使用comm -23 <(command1) <(command2)
。
在Windows的PowerShell中,如果您有comm -23 $(command1) $(command2)
模块(https://github.com/cmderdev/cmder/issues/318),则可以使用awk
,默认情况下不会内置。
在Windows的Cmder(这是ConEmu的默认shell,我试图使用的)中,这是不可能的。您可以通过键入bash <enter>
来更改ConEmu中使用的shell(显然这会将shell更改为bash)。或点击“创建新外壳”(右下角绿色+叹息旁边的箭头)&gt;从弹出窗口中选择一个shell。或菜单&gt;设置&gt;启动&gt;指定的命名任务(这将设置ConEmu默认启动的shell)。