linux – 如何通过读取多值分隔文件来编写单值行

我有一个简单的问题,我相信大多数人都有这个答案.

我有一个带有以下数据的分隔文件:

server1;user1;role
server1;user2;role,role 2
server2;user1;role,role 2,role 3

请注意,角色“列”是逗号分隔的,可能还有使用空格的多值信息和名称,不同于以分号分隔和单值的文件的其余部分.

我需要将每个“角色”显示在不同的行中,但与服务器和用户信息相关.例如:

server1;user1;role
server1;user2;role
server1;user2;role 2
server2;user1;role
server2;user1;role 2
server2;user1;role 3 

我不需要在一个服务器/用户线上拥有所有角色,而是每行需要一个角色.

你有什么建议在Bash脚本上创建吗?我尝试嵌套,同时读取组合,也尝试循环读取数组,但到目前为止,我无法完成(我知道可能我将不得不使用这些函数,但以不同的方式).

这是我一直在研究的Bash脚本:

#!/bin/bash
input="/file/input.csv"
output="/file/output.csv"
declare -a ARRAYROLES
while IFS=';' read -r f1 f2 f3
do
  ARRAYROLES=($f3)
  field1=$f1
  field2=$f2
  for element in "${ARRAYROLES[@]}"
  do
    echo "$field1;$field2;$element" >> "$output"
  done
  field1=''
  field2=''
done < "$input"

这是我到目前为止的输出(非常接近但不够好):

server1;user1;role
server1;user2;role,role
server1;user2;2
server2;user1;role,role
server2;user1;2,role
server2;user1;3

请注意,角色“列”按空格划分(我确信这是因为读取数组的for元素语句)

任何想法将不胜感激.

问候,
安德烈斯.

解决方法:

更改

ARRAYROLES=($f3)

IFS=, read -ra ARRAYROLES <<< "$f3"

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...