2014-01-24 35 views
5

我的文字是這樣的:cut:我們可以設置多個空格作爲分隔符嗎?

word1 word2 word3 word4 

有可能是對詞之間的一個以上的空間,我想從每行得到的話一些欄目。當我使用cat file | cut -d ' ' -f1,2,4似乎有些領域是空間,這不是我所期望的。我知道awk可以實現這一點。問題是我們可以只用cut來做到這一點嗎?即,我們可以在cut中設置多個空格作爲分隔符,但數字是否有所不同?

+0

由於空格是分隔符,因此值不能有空格。這些值實際上是空字符串。 –

回答

6

不,你不能。如果你希望能夠使用多個字符(甚至是正則表達式)作爲分隔符,那麼可以使用awk來代替。

+1

用awk添加一個例子會很棒 – rebrec

3

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

謝謝@fedorqui的sugesstion

+3

'awk'{print $ 1,$ 2,$ 4;}'file'就足夠了,不需要'cat'。 – fedorqui

2

不,對不起,分隔符總是隻有一個字符。但是你可以使用閱讀代替

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

傳遞給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 
8

之前,假設你有一個合理的IFS(如IFS=$' \n\t')使用Word分裂正如其他人所說,cut不能單獨做(而awk是最好的選擇,因爲因爲它是唯一需要的工具)。如果你仍然想使用cut,你可以用tr但是結合起來,:

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

tr -s ' '摺疊多個空格的每個跨度爲每一個空間。

5

此外,您還可以使用位置參數

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

由於bash的默認內部字段分隔符是空白,你能避免使用BASH read內建命令使用cut或任何其他外部工具。

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

在此,簡單地_充當第三字段一個垃圾變量。

相關問題