タブ区切りデータをコンマ区切りデータに変換するには?

タブ区切りデータをコンマ区切りデータに変換するには?

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"

答え1

#!/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

これにより、各タブに対して新しい列が作成され、コメント列が一緒に配置されますが(タブが含まれていない場合)、空の列が追加されます(例の出力が同じであるため、必要になる場合があります)。すべてのスペースを分割するには(テーブルの追加タブは折りたたまれますが、説明の各単語は新しい列として表示されます)、そのFS="\t";文を削除してください。

"子孫のためにsまたはs、または埋め込みスペースを望まない場合は、=1行にすることができます。

awk -v OFS=, '{$1=$1;print}'

答え2

これは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

答え3

私のように怠惰な人で、スクリプトを書かずに1つのコマンドラインですべてのことをしたい場合は、この方法を使用してください。

ec2-describe-snapshots -H --hide-tags | sed -e 's/^I/","/g' | sed -e 's/^/"/' | sed -e 's/$/"/'> snapshots.csv

^I+をctrl押すだけですv i

最初sedはすべてtabs","。 2 番目はsed各行の先頭に a を挿入し、最後の sed は各行の最後に終端子を挿入します。""

答え4

sedは私が見たものの中で最も便利なLinuxユーティリティです。

sed 's/\t/","/g' TabSeparatedValues.txt > CommaSeparatedValues.csv
sed -i 's/.*/"&"/' CommaSeparatedValues.csv

最初のコマンドは、各行のすべてのタブ文字をコンマと引用符で置き換えます。 2番目のコマンドは、各行の先頭と末尾に引用符を挿入して各値を引用符で囲んで、カンマを値の一部として使用できるようにします。

関連情報