我想使用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命令实现预期结果?
答案 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