我想将项目列表(键/值对)转换为表格格式。解决方案可以是 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
...
我已经查看了诸如这种在 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
更新
感谢所有提供解决方案的人。其中一些看起来很有希望,但我认为我的工具版本可能已经过时并且我遇到了一些语法错误。我现在看到的是,我没有从非常明确的要求开始。感谢 sputnick 在我阐明全部要求之前第一个提供解决方案。当我写这个问题时,我度过了漫长的一天,因此不是很清楚。
我的目标是提出一个非常通用的解决方案,将多个项目列表解析为列格式。我认为该解决方案不需要支持超过 255 列。列名不会提前知道,这样解决方案将适用于任何人,而不仅仅是我。两个已知的东西是 kev/值对之间的分隔符(“:”)和列表之间的分隔符(空行)。为这些设置一个变量会很好,以便其他人可以对其进行配置以重用它。
通过查看建议的解决方案,我意识到一个好的方法是对输入文件进行两次传递。第一遍是收集所有列名,可选择对它们进行排序,然后打印标题。其次是获取列的值并打印它们。