如何在保留前缀的同时将字符串拆分为多行?

时间:2014-01-21 13:03:00

标签: string shell awk split

我想使用awk之类的CLI工具拆分以下几行。

prefix11 prefix12 prefix13 key11 value11 key12 value12
prefix21 prefix22 prefix23 key21 value21 key22 vaule22 key23 value23
prefix31 prefix32 prefix33 key31 value31

每行都有固定数量的前缀(用空格分隔),后跟键值对。结果应该在每一行中都有前缀,但只有一个键值对:

prefix11 prefix12 prefix13 key11 value11
prefix11 prefix12 prefix13 key12 value12
prefix21 prefix22 prefix23 key21 value21
prefix21 prefix22 prefix23 key22 value12
prefix21 prefix22 prefix23 key23 value23
prefix31 prefix32 prefix33 key31 value31

我知道如何用awk拆分字符串,但是我正在努力解决前缀问题以及键值对的数量不固定这一事实。

如何使用Unix / Linux CLI命令实现预期结果?

2 个答案:

答案 0 :(得分:4)

这可以是一种方式:

awk '{a=$1 OFS $2 OFS $3; for (i=4; i<NF; i+=2) print a,$i,$(i+1); a=""}' file

解释

  • BEGIN{FS=OFS=" "}是可选的。
  • a=$1 OFS $2 OFS $3将三个第一个值存储在a变量中。使用OFS以便您可以在BEGIN{}块中指定另一个输出字段分隔符,并将应用于您打印的所有内容。
  • for (i=4; i<NF; i+=2) print a,$i,$(i+1)以两个为一组打印:三个初始值+一对键值。
  • a=""清空变量。

检查

$ awk '{a=$1 OFS $2 OFS $3; for (i=4; i<NF; i+=2) print a,$i,$(i+1); a=""}' test
prefix11 prefix12 prefix13 key11 value11
prefix11 prefix12 prefix13 key12 value12
prefix21 prefix22 prefix23 key21 value21
prefix21 prefix22 prefix23 key22 vaule22
prefix21 prefix22 prefix23 key23 value23
prefix31 prefix32 prefix33 key31 value31

答案 1 :(得分:1)

这是一个简单的脚本,不知道为什么需要先在var a中保存然后再清理它。

awk '{for (i=4;i<=NF;i+=2) print $1,$2,$3,$i,$(i+1)}' file