如何获取comm命令输出的第一列?

29

我想使用 awk 获取 comm 输出的第一列。我了解到 Tab 被用作 comm 的分隔符,因此我执行了以下命令:

awk -F"\t" '{print $1}' comm-result.txt

使用comm-result.txt存储以下输出结果:

comm -3 file1 file2

但是这似乎不起作用。

这个命令也以空格字符作为分隔符,当我的文件包含多个空格时,我会得到奇怪的结果。

我如何只从comm中获取第一列?

3个回答

36
“所以我正在尝试获取comm输出的第一列。”
“comm file1 file2” 输出的第一列包含了文件1中唯一的行。您可以通过调用带有“-2”(抑制仅出现在文件2中的行)和“-3”(抑制同时出现在两个文件中的行)选项的“comm”来跳过后处理步骤。
comm -2 -3 file1 file2   # will show only lines unique to file1

不过,如果你只能处理 comm 的预运行输出,那么像 Carl mentioned 提到的,可以考虑使用 cut 命令:

cut -f1 comm-results.txt

然而,这会导致当第一列为空时出现空行。为了处理这种情况,也许更适合使用 awk
awk -F"\t" '{if ($1) print $1}' comm-results.txt
     ----    ----------------
      |                     |
   Use tab as delimiter     |
                            +-- only print if not empty

非常感谢,我之前不知道有 -1 和 -2 的选项,我以为必须要处理结果。 - Daddou
1
不客气。我之前也不知道,直到我查了手册。 - Shawn Chin

8

cut(1) 对于这个问题可能比 awk 更好。


啊...我现在明白了。因为我只是匆匆浏览答案,所以错过了它。 - Jason Thompson
@CarlNorum 这意味着这个“答案”应该是对已被接受的评论。 - Константин Ван

3

您可以使用comm-2以及-3(如上面已经解释过的),或者使用commgrep结合使用,如下所示:

grep -o '^\S\+' <(comm file1 file2)

因此,输出内容不会包含任何尾随空格。这对于非 comm 命令非常有用。


1
只需稍作调整,就可以在 ps 输出上完美运行!ps -A | grep node | grep -o '^\s*\S\+' - B T

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