我有一个包含以下数据的csv文件:
xyz/randomname-12ab-ab12-234234asdasd,1233.sdfsdf-sdfsdf,123123,10:10.0
abc/randomname-34ab-cd34-456456dfgdfg,4545,321321,10:10.0
我正在跟踪以下循环:
for x in $(cat csv_file | awk -F ',' '{print $1}'); do
aws s3 ls s3://bucket/$x --human-readable --profile default | awk '{print $3" "$4" "$5}'
done
这给了我这样的输出:
12.2 MiB randomname-12ab-ab12-234234asdasd
30.1 MiB randomname-34ab-cd34-456456dfgdfg
我想要实现的是在csv文件中添加第二列,并在第一列中添加前导字符以获取输出,例如:
12.2 MiB randomname-12ab-ab12-234234asdasd 1233.sdfsdf-sdfsdf.xyz
30.1 MiB randomname-34ab-cd34-456456dfgdfg 4545.abc
编辑:
aws s3 ls s3://bucket/ --human-readable --profile default
输出:
PRE xyz/
PRE abc/
2019-03-28 11:16:59 10.5 MiB randomname-1234
2019-01-14 11:53:47 90.2 MiB randomname-3456
randomname-12ab-ab12-234234asdasd
和
randomname-34ab-cd34-456456dfgdfg
文件位于xyz和abc文件夹下。
答案 0 :(得分:1)
请勿使用for
来读取文件。
此脚本从Bash while
循环的csv文件中读取字段,并将它们传递到AWK变量中以在输出中使用。存储桶名称被拆分,以便可以提取最后一部分。
while read -r bucket second_col
do
aws s3 ls s3://bucket/$x --human-readable --profile default | awk -v bucket=$bucket -v second_col=$second_col '{split(bucket, bucket_pre, "/"); print $3, $4, $5, second_col "." bucket_pre[2]}'
done < <(awk -F ',' '{print $1 $2}' csv_file)
我不知道csv文件中的第二个字段是什么,所以我组成了一个变量名(second_col
)。您应该替换一个更有意义的。当提供伪数据且无法识别其含义并且在问题中没有赋予它任何含义时,很难给出好的答案。
答案 1 :(得分:1)
这里是全AWK版本。我无权访问AWS,因此必须创建bucket/...
树形结构进行测试。让我知道它是否有效:
$ awk -F, '{ # separator for csv_file processing
cmd="ls -h -s bucket/" $1 # form the command, in aws probably:
# cmd="aws s3 ls s3://bucket/" $1 " --human-readable --profile default"
cmd | getline ret # execute command, get returned output
close(cmd) # close the cmd to save fds
split($1,tmp,"/") # getting the path
print ret,$2 "." tmp[1] # output
}' csv_file
具有路径和(touch
ed)文件bucket/abc/randomname-34ab-cd34-456456dfgdfg
和bucket/xyz/randomname-12ab-ab12-234234asdasd
的输出:
0 bucket/xyz/randomname-12ab-ab12-234234asdasd 1233.sdfsdf-sdfsdf.xyz
0 bucket/abc/randomname-34ab-cd34-456456dfgdfg 4545.abc