如何在定界符上分割字符串并将常量值附加到所有元素

时间:2019-07-08 13:17:48

标签: bash shell unix

我有一个文件,每一行都采用以下格式

KeyA=ValA1,ValA2,ValA3...ValAn 
KeyB=ValB1,ValB2,ValB3....ValBn

我在该文件中有多行,每行的值数量不同。

我的任务是为每行附加Val Key。预期的样本输出:

ValA1 KeyA
ValA2 KeyA
ValA3 KeyA
ValB1 KeyB
ValB2 KeyB
ValB3 KeyB

我尝试的是:

while read -r line; do
    KEY=$(echo $line | cut -d '=' -f 1)
    VALUES=$(echo $line | cut -d '=' -f 2)
    for VAL in $VALUES;do
        echo $VAL $KEY
    done
done < file.txt

我能够达到预期的输出,但是我应该在不使用for循环的情况下完成此输出。 有人可以建议我其他解决方案吗?

2 个答案:

答案 0 :(得分:2)

不应该使用shell循环来分析基于行的文本文件;读取程序时,一次解释shell一次。对于批量作业而言,这是极其低效的。请使用专用的文本处理器,例如awk或perl。

awk -F'[=,]' '{k=$1; for(f=2;f<=NF;f++) print $f, k}' file
  • -F'[=,]'-字段由单个逗号/等号分隔。
  • {...}-在没有条件的情况下,此操作将在每一行上执行
  • k=$1-将k设置为字段1
  • for(f=2;f<=NF;f++)-遍历所有剩余字段(NF =字段数)
  • print $f, k-打印字段,空格和值k

答案 1 :(得分:1)

我得到了这个解决方案。首先用=,代替一个空格。然后使用xargs读取每一行并执行一个脚本,该脚本将缓冲第一个参数(即,它们为键)并在所有其他参数上进行迭代输出:

<inputfile tr '[=,]' ' ' |
xargs -l  sh -c 't="$1"; shift; printf "$t %s\n" "$@"' --

第二次尝试执行以下操作,在该操作中,我不用=代替空格,因此,如果值中包含=,则不会被分割。

while IFS== read -r key vals; do
  printf "%s" "$vals" |
  xargs -d, printf "$key %s\n"
done <inputfile