web-dev-qa-db-ja.com

タブ区切りデータをコンマ区切りデータに変換するにはどうすればよいですか?

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"
8
cwd
#!/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}'
10
Kevin

これが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
4
Patrick

私のように怠惰で、スクリプトを書かずに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は各行の終わりに"を挿入します。

3
Tim Kennedy

別の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で呼び出す

3
Jim

sedは、私が今まで出会った中で最も有用なLinuxユーティリティです。

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

最初のコマンドは、すべての行のすべてのタブをコンマと引用符で置き換えます。 2番目のコマンドは、各行の最初と最後に引用符を挿入します。これにより、各値が引用符で囲まれ、コンマを値の一部にすることができます。

1
Paul

これはあなたのために働くかもしれません:

sed 's/\t\+/,/g;s/^\|$/"/g;s/,/"&"/g;s/"\([0-9]\+\)"/"=\1"/g' file
0
potong