我有这样的文字:
word1 word2 word3 word4
一对单词之间可能有多个空格,我想从每一行得到一些单词列。当我使用cat file | cut -d ' ' -f1,2,4
时,似乎某些字段是空间,这不是我的预期。我知道awk
可以做到这一点。问题是我们是否可以仅使用cut
执行此操作?也就是说,我们可以在cut
中设置多个空格作为分隔符,但数量会有所不同吗?
答案 0 :(得分:12)
正如其他人所说,cut
不能单独做到(awk
是最好的选择,因为它是唯一需要的工具)。如果您仍想使用cut
,则可以将其与tr
结合使用,但是:
tr -s ' ' <<<"word1 word2 word3 word4" | cut -d ' ' -f1,2,4
tr -s ' '
将多个空格的每个范围折叠成一个空格。
答案 1 :(得分:8)
答案 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
这里,_
只是第三个字段的垃圾变量。