2017-10-14 31 views
0

我試圖從在時尚格式,如文本文件中讀取列(其中你有一個關鍵字列和相關的密鑰值):讀詞/短語與空間

蜜桔12

榴蓮5

蘋果3.5

使用讀取功能,我可以在閱讀欄目,但只有當列基本上每一個字。在上述示例中,我不確定要做什麼,因爲第二項是兩個單詞,但我想將它作爲一個單詞存儲。

回答

1

隨着一個正則表達式:

while read -r line; do 
    [[ $line =~ ^(.*)\ (.*)$ ]] && echo "${BASH_REMATCH[1]}|${BASH_REMATCH[2]}" 
done < file 

輸出:

 
tangerine|12 
durian fruit|5 
apple|3.5 

${BASH_REMATCH[1]}包含第一列和${BASH_REMATCH[2]}秒柱。

+0

很好,謝謝!你能簡單介紹一下你所使用的正則表達式格式嗎?我總體上知道一些正則表達式,但它看起來有點像巨無霸。 – Yuerno

+0

後續問題:是否可以使用循環迭代BASH_REMATCH 1或2中的每個條目?我試圖使用一個for循環,使用一個短語,例如:「for i in」$ {BASH_REMATCH [1]「」,但它只獲取列表中的最後一個條目。 – Yuerno

+0

我的語言技能還不夠。 '\'僅用於轉義空格字符。正則表達式從左到右進行處理。 '*'很貪婪,並盡力捕捉。對於第二個問題:我會省略雙引號。 – Cyrus

2

您應該使用除空格以外的其他名稱來區分名稱和計數,如選項卡。然後,你可以使用

while IFS=$'\t' read -r fruit count; do 
    echo "Fruit: $fruit" 
    echo "Count: $count" 
done < data.txt 

如果不能做出改變,你可以閱讀每一行到一個數組中,並重新加入第一組列。不過,這會失去任何特定的空白區域。

while read -a data; do 
    fruit=${data[*]:0:${#data[@]}-1} 
    count=${data[@]:${#data[@]}-1} 
done < data.txt 

無論採用哪種方式,都可以在循環內建立水果名稱和計數的數組。

while ...; do 
    fruits+=("$fruit") 
    counts+=("$count") 
done << ... 

for ((i=0; i<${#fruits[@]}; i++)); do 
    echo "Fruit #$i: there are ${counts[i]} ${fruits[i]}(s)" 
done 
+1

使用Bash 4.3或更新版本,您可以使用'$ {data [-1]}'訪問最後一個元素。 –

+0

我總是忘記什麼時候和什麼讓你使用負指數。 – chepner

+0

這也很好,謝謝!筆者想到,任何特定的白色空間都會丟失,例如,「榴蓮果」會變成「榴蓮果」,但它運行良好,似乎保持了空間。我有和第一個答案一樣的問題;我可以遍歷水果的內容並將其作爲數組來計數嗎? – Yuerno

相關問題