CUT支持多个空格作为分隔符吗?

16

我有这样的文本:

word1 word2   word3  word4

在每一行中,可能会有一个单词对之间的多个空格,我想从每一行中获取一些单词列。当我使用 cat file | cut -d ' ' -f1,2,4 时,似乎有些字段是空格,这不是我期望的结果。我知道 awk 可以实现这一点。问题是我们能否仅使用 cut 来完成此操作?也就是说,我们可以将多个空格设置为 cut 的分隔符,但数量会变化吗?


由于空格是分隔符,因此值不能包含空格。这些值实际上是空字符串。 - glenn jackman
8个回答

20

正如其他人所说,cut不能单独完成这个任务(而且awk是最好的选择,因为它是唯一必要的工具)。如果你仍然想使用cut,你可以将其与tr结合使用:

tr -s ' ' <<<"word1 word2   word3  word4" | cut -d ' ' -f1,2,4

tr -s ' '将连续的多个空格折叠成一个空格。


我更喜欢这个比awk。打那么多花括号,还要打出print和美元符号。只要记住“压缩”选项的-s,然后将其通过tr管道传递即可。它甚至比awk少一个字符。有什么不喜欢的呢? - NeilG

12

使用 awk,兄弟们:awk '{print $1, $2, $4;}' file

感谢 @fedorqui 的建议


3
awk '{print $1, $2, $4;}' file 这条命令足以,不需要使用 cat 命令。该命令的作用是从文件中读取数据,并打印每行的第一、第二和第四个字段。 - fedorqui

8
不可以,如果您想使用超过一个字符(甚至是正则表达式)作为分隔符,则应该使用awk代替。

6
加上一个使用awk的例子会很棒。 - rebrec

6
此外,您可以使用位置参数。
line="word1 word2   word3  word4"
set -- $line                       # no quotes here!
echo $1 $2 $4

word1 word2 word4

4
假设您有一个合理的IFS(例如IFS=$' \n\t'),在传递给cut之前使用单词拆分。
$ var="word1 word2   word3  word4"; echo $var
word1 word2 word3 word4
$ var="word1 word2   word3  word4"; echo $var | cut -d ' ' -f1,2,4
word1 word2 word4

那么针对您来说

$ var=$(cat "file"); echo $var | cut -d ' ' -f1,2,4

2
不好意思,cut 中的分隔符始终只能是一个字符。但您可以使用 read 代替。
while read col1 col2 col3 col4
do
    echo "$col1 $col2 $col4"
done < file

2
自从BASH的默认内部字段分隔符是空格后,您可以通过使用BASH内置命令read来避免使用cut或任何其他外部工具。
while read f1 f2 _ f4; do echo "$f1 $f2 $f4"; done < file

在这里,_ 只是作为第三个字段的无用变量。


1
我创建了一个补丁,为cut添加了一个新的-m命令行选项,该选项在字段模式下工作,并将多个连续的分隔符视为单个分隔符。这基本上以一种相当高效的方式解决了OP的问题。我几天前还向上游提交了这个补丁,希望它能被合并到coreutils项目中。
关于在cut中添加更多与空白相关的功能,还有一些进一步的想法,对所有这些的反馈将是很好的。我愿意为cut实现更多的补丁并将它们提交到上游,这将使这个实用程序在各种实际场景中更加多功能和可用。

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