【问题标题】:Unix Shell Scripting: AWK/SED Loop [closed]Unix Shell 脚本:AWK/SED 循环 [关闭]
【发布时间】:2017-03-16 20:17:36
【问题描述】:

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

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

【问题讨论】:

  • 看起来像一个微不足道的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吧?
  • 你有尝试过什么吗?到目前为止发布您的尝试会有所帮助,而不是指望其他人为您解决整个问题。
  • 我试过这个 - 但似乎缺少一些东西 awk -F '[:,]' '{for(i=5;i

标签: bash shell unix awk sed


【解决方案1】:

鉴于您最近更新的要求:

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

【讨论】:

  • 这很好用,谢谢!但是我在玩另一个实际的测试用例,其中文件包含另一个条目,例如: testuser4:x:502::192.168.164.160 然后代码会删除(如预期的那样)502 和 192.168.164.160 之间的所有内容。但是,它应该显示类似 testuser4;502;;192.168.164.160
  • 道歉 - 我对测试用例和问题的文本冷酷无情。我现在已经更正了。
  • 感谢您的反馈和回答,Ed!下次发帖前会记住你的建议。这就像一个魅力:)
  • 不客气,请参阅stackoverflow.com/help/someone-answers 了解下一步操作。
【解决方案2】:

使用 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

输出:

根;0;;192.168.164.164 箱;1;箱;192.168.164.164 bin;1;守护进程;192.168.164.164 守护进程;2;bin;192.168.164.164 守护进程;2;守护进程;192.168.164.164 测试;501;test1;192.168.164.160 测试;501;test2;192.168.164.160 测试;501;test3;192.168.164.160 测试;501;test4;192.168.164.160 测试5;502;;192.168.164.160

【讨论】:

    【解决方案3】:

    Perl:

    perl -F'[:,]' -lanE '$,=";"; print @F[0,2],$_,$F[-1] for @F[3..$#F-1]' file
    

    【讨论】:

      猜你喜欢
      • 2014-01-26
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多