使用空格作为带切割命令的分隔符

时间:2009-05-03 11:24:23

标签: bash unix cut

我希望使用空格作为cut命令的分隔符。

我可以使用什么语法?

7 个答案:

答案 0 :(得分:315)

cut -d ' ' -f 2

其中2是您想要的以空格分隔的字段的字段编号。

答案 1 :(得分:140)

通常,如果使用空格作为分隔符,则需要将多个空格视为一个空格,因为您解析命令的输出,将某些列与空格对齐。 (以及谷歌搜索引导我来到这里)

在这种情况下,单个cut命令是不够的,您需要使用:

tr -s ' ' | cut -d ' ' -f 2

awk '{print $2}'

答案 2 :(得分:33)

你也可以说

cut -d\  -f 2

请注意反斜杠后面有两个空格。

答案 3 :(得分:4)

just discovered您还可以使用"-d "

cut "-d "

测试

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am

答案 4 :(得分:3)

scut,一个类似剪切的实用程序(更聪明,但我做得更慢)可以使用任何perl正则表达式作为破坏令牌。打破空白是默认设置,但你也可以打破多字符正则表达式,替代正则表达式等。

scut -f='6 2 8 7' < input.file  > output.file

所以上面的命令会破坏空格上的列并按顺序提取(0-based)cols 6 2 8 7。

答案 5 :(得分:3)

如果数据具有多个空格,则无法通过剪切轻松完成。我发现规范化输入以便于处理很有用。一个技巧是使用sed进行标准化,如下所示。

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar

答案 6 :(得分:0)

我有一个答案(我承认有些令人困惑的答案)涉及sed,正则表达式和捕获组:

  • \S* - 第一个字
  • \s* - 分隔符
  • (\S*) - 第二个字 - 捕获
  • .* - 其余部分

作为sed表达式,需要对捕获组进行转义,即\(\)

\1返回捕获组的副本,即第二个单词。

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta

当你看到这个答案时,它有点令人困惑,你可能会想,为什么要这么麻烦?好吧,我希望有些人可能会去“啊哈!”并将使用此模式通过单个sed表达式解决一些复杂的文本提取问题。