awk和grep cut之间的确切区别是什么?[关闭]


30

我们知道,可以使用以下两种技术从文件中获得所需行的第二列:

awk '/WORD/ { print $2 }' filename

要么

grep WORD filename| cut -f 2 -d ' '

我的问题是:

  • 上面的两个命令有什么区别?
  • 哪一个表现最好?
  • 使用而awk不是使用的优点是什么cut,反之亦然?
  • 有什么选择可以awk给我们带来cut反过来呢?

那是echo filename还是cat filename
2014年

@AvinashRaj很抱歉编辑
Networker

Answers:


35

您的两行之间最明显的区别将取决于输入。cut使用单个字符-d作为字段分隔符(默认为TAB),并且每次出现该字符都会启动一个新字段。awk但是,更加灵活。分隔符位于FS变量中,并且可以是空字符串(每个输入字符都构成一个单独的字段),单个字符或正则表达式。单个空格字符的特殊情况(默认值)意味着可以在任何空白序列上进行分割。另外,awk默认情况下禁止前导空格。

请比较:

$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc    def" | cut -f 2 -d ' '

$ echo " abc def" | cut -f 2 -d ' '
abc


$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc    def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def

在此,awkabc和分隔空格,defcut将每个空格作为分隔符。

您将采取什么取决于您想要实现的目标。否则,我希望cut它会更快,因为它是一个较小的,单一目的的工具,但awk具有自己的编程语言。


我想要的答案,谢谢,我会将问题标记为已回答@Dubu
Networker

1
cut可能会比单独的 Awk快,但并不确定grep ... | cut会比纯Awk快。
通配符

8

一般来说,工具越专业,它的速度就越快。因此,在大多数情况下,您可以期望cutgrep比更快sed,并且sed比更快awk。如果通过一次调用更复杂的工具来弥补更简单工具的较长管道,那就没有经验了。这仅与大输入(例如,数百万行)有关;对于简短的输入,您不会看到任何区别。

当然,更复杂的工具的优势在于它们可以做更多的事情。

您的命令不必要地使用cat。改用重定向(特别是如果您担心速度,尽管您可能不应该担心速度,直到运行基准测试¹)。

<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '

这些命令几乎是等效的。不同之处在于:

  • awk和grep具有不同的regexp语法。Awk和grep -E具有几乎相同的regexp语法(扩展的正则表达式)。
  • cut -d ' '将每个单独的空格字符视为分隔符。Awk的默认定界符是任何空格序列,可以是多个空格,制表符等。您不能使用任意空格序列作为分隔符cut。使用单个空格作为在AWK分离器,设置字段分隔符相匹配的单个的空间,比由单个空间(这是一种特殊情况,意思是“任何空白序列”,即,默认的)一个正则表达式的其他一个正则表达式:awk -F '[ ]' '/WORD/ {print $2}'

¹ 程序优化的第一条规则:不要这样做。程序优化的第二条规则(仅适用于专家!):暂时不要做。- 迈克尔·杰克逊


1

你的命令

cat fileName | awk '/WORD/ { print $2 }'

您甚至不需要cat命令。您可以尝试,

awk '/WORD/ { print $2 }' filename

下面的命令将输出从cat重定向到grep,然后剪切:

cat fileName | grep WORD | cut -f 2 -d ' '

很可能我们必须避免输出重定向。Awk可以单行执行此工作,但是cut需要一个grep命令以仅获取包含特定单词的行,并根据分隔符空间打印列2。

如果切割失败,则可以用awk进行操作。


3
ps你也不需要grep的cat命令。你可以做grep WORD filename
2014年

@ edvinas.me是的。
Avinash Raj 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.