【问题标题】:read a file and split each line into multiple variables [duplicate]读取文件并将每一行拆分为多个变量[重复]
【发布时间】:2017-02-28 18:07:16
【问题描述】:

我有一个文件,里面有这样的文本:

471_068 0
AALIAN  1
ASHLEY-U    95
CATRIONA_W  97
STESSY K    08

此数据与项目“名称”相关,它是“颜色 ID”
我需要将名称与 ID 分开并将它们存放在单独的变量中。


请注意,使用 10 以下数字时的 ID 可以有前导 0 或没有,所以我需要在它们出现时解析它们(04 需要保持 04,1 需要保持 1 不4 或 01)

名称中可以包含下划线 (_)、连字符 (-) 或空格 (),这些也需要保留。

这是我用于读取文件的内容,它在循环中逐行读取文件,这很棒,但我不知道如何正确分离我想要的变量。

while read fLine
do
  PRDT=$(echo $fLine | tr '\t' '\n')
  echo First Var is ${PRDT[0]} - Second Var is ${PRDT[1]}
done < Products

【问题讨论】:

  • 名称和颜色是由制表符分隔的,还是只是多个空格?您是否考虑过使用 awk?
  • 我想我忘了提到,是的,我想要的两个变量由 TAB 分隔,它们来自 TSV 文件。

标签: linux bash shell variables


【解决方案1】:

read 可以自己做。见BashFAQ #1

while IFS=$'\t' read -r key value; do
  echo "First Var is $key - Remaining Line Contents Are $value"
done

请注意,如果您想丢弃第二列之后的任何内容(而不是将该内容附加到值),则改为:

while IFS=$'\t' read -r key value _; do
  echo "First Var is $key - Second Var is $value"
done

如果您想以能够按名称查找 ID 的方式存储 ID,则关联数组(在 bash 4.0 中添加)是正确的工具:

declare -A color_ids=( )
while IFS=$'\t' read -r key value; do
  color_ids[$key]=$value
done

for name in "${!color_ids[@]}"; do
  value=${color_ids[$name]}
  echo "Stored name $name with value $value"
done

【讨论】:

  • 第一部分的工作方式完全符合我的需要,在问这个问题之前,我应该先阅读read 手册页>。
猜你喜欢
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 2023-03-29
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多