Amazon ec2コマンドラインツールを介してec2スナップショットのリストをリクエストしています。
ec2-describe-snapshots -H --hide-tags > snapshots.csv
データは次のようになります。
SnapshotId VolumeId StartTime OwnerId VolumeSize Description
snap-00b66464 vol-b99a38d0 2012-01-05 5098939 160 my backup
snapshots.csv
にリダイレクトする前にデータを傍受し、次のことを行うにはどうすればよいですか。
=
を接頭辞として付けて、Excelがそれをテキストとして扱うようにします。たとえば、OwnerId
は"=5098939
"にする必要があります(これができない場合は必要ありません)インラインで実行され、代わりにスクリプトファイルまたは関数が必要になります)望ましい出力:
"SnapshotId","VolumeId","StartTime","OwnerId","VolumeSize","Description"
"snap-00b66464","vol-b99a38d0","2012-01-05","=5098939","=160","my backup"
#!/usr/bin/awk -f
BEGIN { FS = "\t"; OFS = "," }
{
for(i = 1; i <= NF; i++) {
if ($i + 0 == $i) { $i = "=" $i }
else gsub(/"/, "\"\"", $i);
$i = "\"" $i "\""
}
print
}
この名前をconvert.awk
、どちらでも呼び出すことができます
ec2-describe-snapshots -H --hide-tags | awk -f convert.awk > snapshots.csv
または(実行権限を追加した後、chmod a+x convert.awk
)
ec2-describe-snapshots -H --hide-tags | ./convert.awk > snapshots.csv
これにより、各タブに新しい列が作成され、タブが含まれていない場合はコメント列がまとめられますが、空の列が追加されます(サンプル出力はこのように表示されるため、実際に必要な場合があります)。すべての空白で分割する場合(これにより、テーブル内の余分なタブが折りたたまれますが、説明内の各Wordが新しい列として配置されます)、FS="\t";
ステートメント。
将来の世代のために、あなたが"
sまたは=
sまたは埋め込み空白、1行にすることができます。
awk -v OFS=, '{$1=$1;print}'
これがPerlソリューションです。これはsed/awkで可能かもしれませんが、数値部分をテストするとかなり醜くなります。
ec2-describe-snapshots -H --hide-tags | \
Perl -e 'use Scalar::Util qw(looks_like_number);
while (chomp($line = <STDIN>)) {
print(join(",", map { "\"" . (looks_like_number($_) ? "=$_" :
do {s/"/""/g; $_}) . "\"" }
split(/\t/, $line)) . "\n");
}' \
> snapshots.csv
私のように怠惰で、スクリプトを書かずに1つのコマンドラインですべてを実行したい場合は、次のようにします。
ec2-describe-snapshots -H --hide-tags | sed -e 's/^I/","/g' | sed -e 's/^/"/' | sed -e 's/$/"/'> snapshots.csv
^I
は、 ctrl+vi。
最初のsed
は、すべてのtabs
を","
にスワップします。 2番目のsed
は各行の先頭に"
を挿入し、最後のsedは各行の終わりに"
を挿入します。
別のPerlソリューション:
#!/usr/bin/Perl -wln
use strict;
my($n,$s);chomp();
for $s ( split(/\t/,$_) )
{
$s = '='.$s if ($s =~ /^\d+$/);
$n.= '"'.$s.'",';
}
$n =~ s/(.*),/$1/;print $n;
ec2-describe-snapshots -H --hide-tags | /var/tmp/script.pl > output.txt
で呼び出す
sedは、私が今まで出会った中で最も有用なLinuxユーティリティです。
sed 's/\t/","/g' TabSeparatedValues.txt > CommaSeparatedValues.csv
sed -i 's/.*/"&"/' CommaSeparatedValues.csv
最初のコマンドは、すべての行のすべてのタブをコンマと引用符で置き換えます。 2番目のコマンドは、各行の最初と最後に引用符を挿入します。これにより、各値が引用符で囲まれ、コンマを値の一部にすることができます。
これはあなたのために働くかもしれません:
sed 's/\t\+/,/g;s/^\|$/"/g;s/,/"&"/g;s/"\([0-9]\+\)"/"=\1"/g' file