使用awk(或sed)的comm命令

时间:2018-01-16 14:09:42

标签: shell awk sed conemu

我想使用comm打印出仅存在于两个输入流之一中的所有行(尽管使用此命令不是必需的)。但是,使用awksed似乎有点搞砸了。例如。 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

3 个答案:

答案 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)。