目前,我有一个命令,它以下列格式输出数据:
apple: banana
apple: cantaloupe
apple: durian
apple: eggplant
banana: cantaloupe
banana: durian
durian: eggplant
eggplant:
换句话说,它是一个树状结构,其中apple
是根,它有子banana
和eggplant
,banana
也有子子cantaloupe
和durian
。eggplant
没有子级,但仍然有一个后缀冒号。
我想将输出连接成以下格式:
apple: banana eggplant
banana: cantaloupe durian
durian: eggplant
eggplant:
有些对象可能在输出中显示不止一次(在本例中,cantaloupe
、durian
和eggplant
有多个父节点)。虽然这个例子没有它,但也可能有多个根节点(即与apple
相同的宽度)。
我将如何修改这个输出?我现在通常使用bash/shell脚本,所以我认为awk
可能是最好的处理方法,但是如果用Python、Ruby或其他脚本语言来更好地处理这个问题,我也愿意接受建议。
发布于 2015-08-21 09:03:08
您可以使用awk:
awk -F ': *' '{a[$1] = (a[$1]? a[$1] OFS $2 : $2)}
END { for (i in a) print i ": " a[i] }' file
eggplant:
apple: banana cantaloupe durian eggplant
banana: cantaloupe durian
durian: eggplant
维持原有秩序:
awk -F ': *' '!($1 in a){b[++n]=$1} {a[$1] = (a[$1]? a[$1] OFS $2 : $2)}
END{for (i=1; i<=n; i++) print b[i] ": " a[b[i]]}' file
apple: banana cantaloupe durian eggplant
banana: cantaloupe durian
durian: eggplant
eggplant:
发布于 2015-08-21 09:04:19
awk -F: '{ list[$1] = list[$1] $2 } END { for (i in list) printf "%s:%s\n", i, list[i] }'
使用awk
中的关联数组累积条目,生成列表。awk
中的字符串连接有点奇怪。最后,打印出键和键的条目。如果需要订购,你就得这么说。
假设左边的键应该按照输入的LHS第一次出现的顺序输出,那么您可以使用这个稍微复杂的脚本:
awk -F: '{ if (!($1 in list)) keys[++n] = $1; list[$1] = list[$1] $2 }
END { for (j = 1; j <= n; j++) printf "%s:%s\n", keys[j], list[keys[j]] }'
https://stackoverflow.com/questions/32145695
复制