Bash 使用shell脚本编辑文本格式

Bash 使用shell脚本编辑文本格式,bash,shell,command-line,command-line-interface,sh,Bash,Shell,Command Line,Command Line Interface,Sh,我正在尝试制作一个文本编辑脚本。在本例中,我有一个名为text.csv的文本文件,其内容如下: first;48548a;48954a,48594B second;58757a;5875b third;58756a;58576b;5867d;56894d;45864a 我想使文本格式如下所示: first;48548a first;48954a first;48594B second;58757a second;5875b third;58756a third;58576b third;586

我正在尝试制作一个文本编辑脚本。在本例中,我有一个名为text.csv的文本文件,其内容如下:

first;48548a;48954a,48594B
second;58757a;5875b
third;58756a;58576b;5867d;56894d;45864a
我想使文本格式如下所示:

first;48548a
first;48954a
first;48594B
second;58757a
second;5875b
third;58756a
third;58576b
third;5867d
third;56894d
third;45864a
我应该使用什么命令来实现这一点?

我会在awk中这样做

假设您的第一行应该有一个
而不是

$ awk -F\; '{for(n=2; n<=NF; n++) { printf("%s;%s\n",$1,$n); }}' input.txt

$awk-F\;'{for(n=2;n
awk-vfs=';'-vofs=';'{for(i=2;i这里是一个纯bash解决方案,它同时处理

while IFS=';,' read -a data; do 
   id="${data[0]}"
   data=("${data[@]:1}")
   for item in "${data[@]}"; do 
      printf '%s;%s\n' "$id" "$item" 
   done
done < input.txt
当IFS=';,'读取数据;执行
id=“${data[0]}”
数据=(“${data[@]:1}”)
对于“${data[@]}”中的项,请执行以下操作
printf“%s;”%s\n“$id”“$item”
完成
完成
更新-基于chepner建议的替代打印方法:

while IFS=';,' read -a data; do 
   id="${data[0]}"
   data=("${data[@]:1}")
   printf "$id;%s\n" "${data[@]}" 
done < input.txt
当IFS=';,'读取数据;执行
id=“${data[0]}”
数据=(“${data[@]:1}”)
printf“$id;%s\n”“${data[@]}”
完成
当IFS=';,'读取数据;执行
id=“${data[0]}”
数据=(“${data[@]:1}”)
printf“$id;%s\n”“${data[@]}”
完成


awk-vfs=”;“-vofs=”;“{for(i=2;i?在第一行输入数据中,最后一个分隔符应该是逗号还是分号?或者是否接受其中一个字符作为分隔符?(答案可能会影响使用工具分割数据的方式。)嗨,Jordanm,我只是尝试使用awk命令,但我知道如何使用它,这就是为什么我问我应该使用什么命令的原因….:D..顺便说一下,谢谢你的帮助或
printf“$id;%s\n”“${data[@]}”
;无需循环。@chepner-这是一个很好的建议。我通常不喜欢在printf的格式字符串中展开变量,但它确实保存了一个循环。如果您要回答自己的问题,它应该包含一些尚未发布为答案的内容。您应该向上投票并选择一个答案,而不是重新发布答案要“接受”,请阅读。
while IFS=';,' read -a data; do 
   id="${data[0]}"
   data=("${data[@]:1}")
   printf "$id;%s\n" "${data[@]}" 
done < input.txt
awk -v FS=';' -v OFS=';' '{for (i = 2; i <= NF; ++i) { print $1, $i }}'
$ awk -F\; '{for(n=2; n<=NF; n++) { printf("%s;%s\n",$1,$n); }}' input.txt