Bash

如何在 .tsv 文件中使用 bash shell 中的 sed/awk 向 s3 儲存桶路徑添加雙引號

  • November 3, 2021

我有一個.tsv文件,其中包含 s3 儲存桶的源和目標資訊。我正在使用 while 循環從該文件中讀取源和目標路徑並執行s3 cp操作。請注意,該文件包含 100K 行。

如何使用命令使所有源路徑和目標路徑在文件 ( ) 中sed變為雙引號。xx.tsv我需要雙引號,因為 aws s3 無法處理其中包含空格的文件/文件夾名稱而不用"".

我正在尋找類似以下 3 行的內容將被更改

s3://data01/repo01/image live01.png s3://Ata01/vol01/image live01.png
s3://data02/repo01/image live01.png s3://Ata02/vol01/image live01.png
s3://data03/repo01/image live01.png s3://Ata03/vol01/image live01.png

"s3://data01/repo01/image live01.png" "s3://Ata01/vol01/image live01.png"
"s3://data02/repo01/image live01.png" "s3://Ata02/vol01/image live01.png"
"s3://data03/repo01/image live01.png" "s3://Ata03/vol01/image live01.png"

在每個 Unix 機器上的任何 shell 中使用任何 awk:

$ awk -F'\t' -v OFS='"\t"' '{print "\"" $1, $2 "\""}' file
"s3://data01/repo01/image live01.png"   "s3://Ata01/vol01/image live01.png"
"s3://data02/repo01/image live01.png"   "s3://Ata02/vol01/image live01.png"
"s3://data03/repo01/image live01.png"   "s3://Ata03/vol01/image live01.png"

以上假設您的文件名都不包含製表符、換行符或雙引號。

$ cat input.tsv 
s3://data01/repo01/image live01.png     s3://Ata01/vol01/image live01.png
s3://data02/repo01/image live01.png     s3://Ata02/vol01/image live01.png
s3://data03/repo01/image live01.png     s3://Ata03/vol01/image live01.png

注意:列由製表符分隔,而不是多個空格。

sed

$ sed -E 's/^(s3:.*)\t+(s3:.*)/"\1"\t"\2"/' input.tsv 
"s3://data01/repo01/image live01.png"   "s3://Ata01/vol01/image live01.png"
"s3://data02/repo01/image live01.png"   "s3://Ata02/vol01/image live01.png"
"s3://data03/repo01/image live01.png"   "s3://Ata03/vol01/image live01.png"

在兩個擷取組之間使用\s+or[[:blank:]]+代替也\t可以工作,並產生相同的輸出。IE

sed -E 's/^(s3:.*)[[:blank:]]+(s3:.*)/"\1"\t"\2"/' input.tsv

sed -E 's/^(s3:.*)\s+(s3:.*)/"\1"\t"\2"/' input.tsv

[[:blank:]]+版本將匹配一個或多個空格或製表符作為列分隔符,而該\s+版本將匹配一個或多個任何空白字元(包括空格、製表符等)。

awk

$ awk -F'\t' '{print "\"" $1 "\"\t\"" $2 "\""}' input.tsv 
"s3://data01/repo01/image live01.png"   "s3://Ata01/vol01/image live01.png"
"s3://data02/repo01/image live01.png"   "s3://Ata02/vol01/image live01.png"
"s3://data03/repo01/image live01.png"   "s3://Ata03/vol01/image live01.png"

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