我有这样的文字:
word1 word2 word3 word4
一对单词之间可能有多个空格,我想从每行中得到几列单词。当我使用cat file | cut -d ' ' -f1,2,4时,似乎有些字段是空格,这不是我所期望的。我知道awk可以实现这一点。问题是,我们只能用cut来实现这一点吗?也就是说,我们可以在cut中设置多个空格作为分隔符,但数量不同吗?
cat file | cut -d ' ' -f1,2,4
awk
cut
jdg4fx2g1#
正如其他人所说,cut不能单独完成(而awk是最佳选择,因为它是唯一需要的工具)。如果你仍然想使用cut,你可以将它与tr结合使用,但是:
tr
tr -s ' ' <<<"word1 word2 word3 word4" | cut -d ' ' -f1,2,4
tr -s ' '将多个空间的每个跨度折叠成一个空间。
tr -s ' '
8qgya5xd2#
使用awk,兄弟:awk '{print $1, $2, $4;}' file谢谢@fedorqui的建议
awk '{print $1, $2, $4;}' file
oknrviil3#
不你不能如果你希望能够使用多个字符(甚至是正则表达式)作为分隔符,那么可以使用awk。
hm2xizp94#
此外,还可以使用位置参数
line="word1 word2 word3 word4" set -- $line # no quotes here! echo $1 $2 $4
word1 word2 word4
yruzcnhs5#
假设您有一个合理的IFS(例如:IFS=$' \n\t')在传递到cut之前使用字拆分
IFS=$' \n\t'
$ 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
cwxwcias6#
不,对不起,cut 中的分隔符始终只有一个字符。但是你可以用 read 代替
while read col1 col2 col3 col4 do echo "$col1 $col2 $col4" done < file
a6b3iqyw7#
由于BASH的默认内部字段分隔符是空白,因此可以通过使用BASH read内置命令来避免使用cut或任何其他外部工具。
read
while read f1 f2 _ f4; do echo "$f1 $f2 $f4"; done < file
在这里,_只是作为第三个字段的垃圾变量。
_
7条答案
按热度按时间jdg4fx2g1#
正如其他人所说,
cut
不能单独完成(而awk
是最佳选择,因为它是唯一需要的工具)。如果你仍然想使用cut
,你可以将它与tr
结合使用,但是:tr -s ' '
将多个空间的每个跨度折叠成一个空间。8qgya5xd2#
使用
awk
,兄弟:awk '{print $1, $2, $4;}' file
谢谢@fedorqui的建议
oknrviil3#
不你不能如果你希望能够使用多个字符(甚至是正则表达式)作为分隔符,那么可以使用awk。
hm2xizp94#
此外,还可以使用位置参数
yruzcnhs5#
假设您有一个合理的IFS(例如:
IFS=$' \n\t'
)在传递到cut
之前使用字拆分所以对你来说
cwxwcias6#
不,对不起,cut 中的分隔符始终只有一个字符。但是你可以用 read 代替
a6b3iqyw7#
由于BASH的默认内部字段分隔符是空白,因此可以通过使用BASH
read
内置命令来避免使用cut
或任何其他外部工具。在这里,
_
只是作为第三个字段的垃圾变量。