Shell-Script
如何將製表符分隔的數據轉換為逗號分隔的數據?
我通過亞馬遜的 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
這將為每個選項卡創建一個新列,它將註釋列保持在一起(除非它包含選項卡),但會添加空列(儘管這是您的範例輸出的外觀,所以也許您確實想要)。如果要拆分所有空格(這將折疊表格中的額外選項卡,但將描述中的每個單詞作為新列),請取出該
FS="\t";
語句。對於後代,如果您不需要
"
s 或=
s 或嵌入式空格,則可以將其設為單行:awk -v OFS=, '{$1=$1;print}'