アイテムのリスト(キーと値のペア)をテーブル形式に置き換えたいと思います。解決策は、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
アップデート
ソリューションを提供してくれたすべての人に感謝します。それらのいくつかは非常に有望に見えますが、私のバージョンのツールは古くなっている可能性があり、構文エラーが発生していると思います。私が今目にしているのは、私が非常に明確な要件から始めなかったということです。私が完全な要件を説明する前に、ソリューションを提供した最初の人であることに敬意を表します。質問を書いたときは長い一日を過ごしたので、あまり明確ではありませんでした。
私の目標は、アイテムの複数のリストを列形式に解析するための非常に一般的なソリューションを考え出すことです。ソリューションは255を超える列をサポートする必要はないと思います。列名は事前に知られることはありません。このようにして、ソリューションは私だけでなく誰にとっても機能します。2つの既知のものは、kev /値のペア間のセパレーター( ":")とリスト間のセパレーター(空の行)です。他の人がこれを再利用できるように構成できるように、それらの変数があると便利です。
提案されたソリューションを見ると、入力ファイルに対して2回のパスを実行するのが良いアプローチであることがわかります。最初のパスは、すべての列名を収集し、オプションでそれらを並べ替えてから、ヘッダーを出力することです。次に、列の値を取得して印刷します。