如何将列表转换为bash中的表
我想将一个项目列表(键/值对)转换为表格格式.解决方案可以是bash脚本,awk,sed或其他一些方法.
假设我有一个很长的列表,例如: date and time: 2013-02-21 18:18 PM file size: 1283483 bytes key1: value key2: value date and time: 2013-02-21 18:19 PM file size: 1283493 bytes key2: value ... 我想转换为带有制表符或其他分隔符的表格格式,如下所示: date and time file size key1 key2 2013-02-21 18:18 PM 1283483 bytes value value 2013-02-21 18:19 PM 1283493 bytes value ... 或者像这样: date and time|file size|key1|key2 2013-02-21 18:18 PM|1283483 bytes|value|value 2013-02-21 18:19 PM|1283493 bytes||value ... 我已经看过像这个An efficient way to transpose a file in Bash这样的解决方案,但似乎我在这里遇到了不同的情况. awk解决方案部分适用于我,它不断将所有行输出到一个长列列中,但我需要将列限制为唯一列表. awk -F': ' ' { for (i=1; i<=NF; i++) { a[NR,i] = $i } } NF>p { p = NF } END { for(j=1; j<=p; j++) { str=a[1,j] for(i=2; i<=NR; i++){ str=str" "a[i,j]; } print str } }' filename UPDATE 感谢所有提供解决方案的人.其中一些看起来非常有前景,但我认为我的工具版本可能已经过时,我得到一些语法错误.我现在看到的是,我并没有以非常明确的要求开始.在我阐述完整要求之前,我很荣幸能够成为第一个提供解决方案的人.我写了这个问题已经度过了漫长的一天,因此不太清楚. 我的目标是提出一个非常通用的解决方案,用于将多个项目列表解析为列格式.我认为该解决方案不需要支持超过255列.列名不会提前知道,这样解决方案将适用于任何人,而不仅仅是我.两个已知的东西是kev /值对(“:”)和列表之间的分隔符(空行)之间的分隔符.为这些变量设置一个变量会很好,这样它们就可以配置给其他人来重用它. 从查看提出的解决方案,我意识到一个好的方法是对输入文件进行两次传递.第一步是收集所有列名,可选择对它们进行排序,然后打印标题.其次是抓取列的值并打印它们. 解决方法
这是一个纯粹的awk解决方案:
# split lines on ": " and use "|" for output field separator BEGIN { FS = ": "; i = 0; h = 0; ofs = "|" } # empty line - increment item count and skip it /^s*$/ { i++ ; next } # normal line - add the item to the object and the header to the header list # and keep track of first seen order of headers { current[i,$1] = $2 if (!($1 in headers)) {headers_ordered[h++] = $1} headers[$1] } END { h-- # print headers for (k = 0; k <= h; k++) { printf "%s",headers_ordered[k] if (k != h) {printf "%s",ofs} } print "" # print the items for each object for (j = 0; j <= i; j++) { for (k = 0; k <= h; k++) { printf "%s",current[j,headers_ordered[k]] if (k != h) {printf "%s",ofs} } print "" } } 示例输入(请注意,在最后一项之后应该有换行符): foo: bar foo2: bar2 foo1: bar foo: bar3 foo3: bar3 foo2: bar3 示例输出: foo|foo2|foo1|foo3 bar|bar2|bar| bar3|bar3||bar3 注意:如果您的数据中嵌入了“:”,则可能需要更改此项. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |