Bash unixshell脚本:AWK/SED循环

Bash unixshell脚本:AWK/SED循环,bash,shell,unix,awk,sed,Bash,Shell,Unix,Awk,Sed,我有一个包含如下条目的文件: root:x:0::192.168.164.164 bin:x:1:bin,daemon:192.168.164.164 daemon:x:2:bin,daemon:192.168.164.164 test:x:501:test1,test2,test3,test4:192.168.164.160 test5:x:502::192.168.164.160 我在UNIX bash/shell脚本中寻找将此文件转换为以下内容的方法: root;0;;192.168.1

我有一个包含如下条目的文件:

root:x:0::192.168.164.164
bin:x:1:bin,daemon:192.168.164.164
daemon:x:2:bin,daemon:192.168.164.164
test:x:501:test1,test2,test3,test4:192.168.164.160
test5:x:502::192.168.164.160
我在UNIX bash/shell脚本中寻找将此文件转换为以下内容的方法:

root;0;;192.168.164.164
bin;1;bin;192.168.164.164
bin;1;daemon;192.168.164.164
daemon;2;bin;192.168.164.164
daemon;2;daemon;192.168.164.164
test;501;test1;192.168.164.160
test;501;test2;192.168.164.160
test;501;test3;192.168.164.160
test;501;test4;192.168.164.160
test5;502;;192.168.164.160
对于bash:

while IFS=: read -r a b c d e; do
  while IFS=, read -r -a i; do
    [[ ${#i[@]} -eq 0 ]] && i=""
    for j in "${i[@]}"; do
      echo "$a;$c;$j;$e"
    done
  done <<< "$d"
done < file
而IFS=:read-ra b c d e;做
当IFS=,read-r-ai;做
[${i[@]}-eq 0]&&i=“”
对于“${i[@]}”中的j;做
回声“$a;$c;$j;$e”
完成

完成鉴于您最新更新的要求:

awk -F'[:,]' -v OFS=';' '{for(i=4;i<NF;i++) print $1, $3, $i, $NF}' file
awk-F'[:,]'-vofs=';''{对于(i=4;iPerl:


看起来像是一个普通的
awk
命令。使用
作为输入字段分隔符,
作为输出字段分隔符,然后打印所需的字段。啊,它比这稍微复杂一些。当字段4包含逗号时,需要将其拆分,然后对该数组的每个元素重复打印。因此这一行
 test:x:501:test1,test2,test3,test4:192.168.164.160应转换为
test;501;test1;192.168.164.160 test;501;test2;192.168.164.160 test;501;test3;192.168.164.160 test;501;test4;192.168.164.160
,对吗?您尝试过什么吗?发布您迄今为止的尝试会有所帮助,而不是期望其他人解决问题我试过这个,但似乎遗漏了一些东西(I=5;它工作得很好,谢谢!但是我在玩另一个实际的测试用例,其中文件包含另一个条目,如:testuser4:x:502::192.168.164.160,然后代码被删除(如预期的那样)502和192.168.164.160之间的所有内容。但是,它应该显示类似testuser4;502;;192.168.164.160的道歉-我对测试用例和问题的文本很冷漠。我现在已经更正了它们。感谢您的反馈和答案,Ed!在下次发布之前会记住您的建议。这就像一个ch手臂:)不客气,看看下一步怎么办。
awk -F'[:,]' -v OFS=';' '{for(i=4;i<NF;i++) print $1, $3, $i, $NF}' file
perl -F'[:,]' -lanE '$,=";"; print @F[0,2],$_,$F[-1] for @F[3..$#F-1]' file