将单词/短语读入带空格的列中

时间:2017-10-14 21:56:29

标签: bash

我正在尝试从一个文本文件中读取格式,例如(您有一个关键字列和关联的键值):

橘子12

榴莲果5

apple 3.5

使用读取功能,我可以将它们作为列读取,但前提是每列基本上都是一个单词。在如上所述的示例情况中,我不确定该怎么做,因为第二个条目是两个单词,但我想将它存储为一个单词。

2 个答案:

答案 0 :(得分: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 :(得分: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]}第二列。