我有一个文件,每一行都采用以下格式
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
循环的情况下完成此输出。
有人可以建议我其他解决方案吗?
答案 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