Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何通过读取多值分隔文件来写入单值行_Linux_Bash_Shell_Csv_Delimiter - Fatal编程技术网

Linux 如何通过读取多值分隔文件来写入单值行

Linux 如何通过读取多值分隔文件来写入单值行,linux,bash,shell,csv,delimiter,Linux,Bash,Shell,Csv,Delimiter,我有一个简短的问题,我相信你们大多数人都有答案 我有一个带分隔符的文件,其中包含以下数据: server1;user1;role server1;user2;role,role 2 server2;user1;role,role 2,role 3 请注意,角色“column”是逗号分隔的,可能包含多值信息和使用空格的名称,不同于文件中以分号分隔和单值的其余部分 我需要将每个“角色”显示到不同的行中,但与服务器和用户信息相关。例如: server1;user1;role server1;user

我有一个简短的问题,我相信你们大多数人都有答案

我有一个带分隔符的文件,其中包含以下数据:

server1;user1;role
server1;user2;role,role 2
server2;user1;role,role 2,role 3
请注意,角色“column”是逗号分隔的,可能包含多值信息和使用空格的名称,不同于文件中以分号分隔和单值的其余部分

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

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"
请注意,角色“column”是按空格划分的(我确信这是因为读取数组的for element语句)

任何想法都将不胜感激

问候,, 安德烈斯。

变化

ARRAYROLES=($f3)

IFS=,读-ra ARRAYROLES

${arr[@]/#/…}
在这种情况下消除了额外循环的需要。

乔纳斯,谢谢你的回答。它与您的更改一起工作,而且我感到欣慰的是,我的代码至少有90%是正确的。PesaThe,谢谢您的回答。它成功了,现在我可以理解其中的一些语句了,这段代码比我的代码紧凑得多。
ARRAYROLES=($f3)
IFS=, read -ra ARRAYROLES <<< "$f3"
while IFS=';' read -r server user roles; do
    IFS=',' read -r -a arr <<< "$roles"
    printf '%s\n' "${arr[@]/#/$server;$user;}"
done < "$input" > "$output"
-a array  
     assign the words read to sequential indices of the array variable ARRAY,
     starting at zero