cut:我们可以设置多个空格作为分隔符吗?

时间:2014-01-24 01:53:17

标签: bash shell cut

我有这样的文字:

word1 word2   word3  word4

一对单词之间可能有多个空格,我想从每一行得到一些单词列。当我使用cat file | cut -d ' ' -f1,2,4时,似乎某些字段是空间,这不是我的预期。我知道awk可以做到这一点。问题是我们是否可以仅使用cut执行此操作?也就是说,我们可以在cut中设置多个空格作为分隔符,但数量会有所不同吗?

7 个答案:

答案 0 :(得分:12)

正如其他人所说,cut不能单独做到(awk是最好的选择,因为它是唯一需要的工具)。如果您仍想使用cut,则可以将其与tr结合使用,但是:

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

tr -s ' '将多个空格的每个范围折叠成一个空格。

答案 1 :(得分:8)

不,你不能。如果您希望能够为分隔符使用多个字符(甚至是正则表达式),请改用awk。

答案 2 :(得分:5)

此外,您可以使用位置参数

line="word1 word2   word3  word4"
set -- $line                       # no quotes here!
echo $1 $2 $4
word1 word2 word4

答案 3 :(得分: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

答案 4 :(得分:3)

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

感谢@fedorqui的建议

答案 5 :(得分:2)

不,我很抱歉, cut 中的分隔符始终只有一个字符。但您可以使用读取而不是

while read col1 col2 col3 col4
do
    echo "$col1 $col2 $col4"
done < file

答案 6 :(得分:2)

由于BASH的默认内部字段分隔符是空格,因此您可以使用BASH cut内置命令来避免使用read或任何其他外部工具。

while read f1 f2 _ f4; do echo "$f1 $f2 $f4"; done < file

这里,_只是第三个字段的垃圾变量。