Shell-Script

如何將製表符分隔的數據轉換為逗號分隔的數據?

  • July 14, 2017

我通過亞馬遜的 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}'

引用自:https://unix.stackexchange.com/questions/28484