使用 split 创建 csv 时,如何在前面添加变量以打开文件流?

使用 split 创建 csv 时,如何在前面添加变量以打开文件流?

我有一个 bash 文件,它需要一个大的 csv 并根据此博客将 csv 分割成较小的 csvhttps://medium.com/swlh/automatic-s3-file-splitter-620d04b6e81c。它工作得很好,因为速度很快,无需下载 csv,这对于 lambda 来说非常有用。分割后的 csv 没有标题,只有原始 csv。这对我来说是个问题,因为我无法使用 apache pyspark 读取一组带有标题行的文件和许多其他没有标题行的文件。

我想为每个写入的 csv 添加标题行。

代码的作用

内文件

  • “s3 //测试桶/test.csv”

OUTFILES - 分成 300K 行

  • “s3//dest-test-bucket/test.00.csv”
  • “s3//dest-test-bucket/test.01.csv”
  • “s3//dest-test-bucket/test.02.csv”
  • “s3//dest-test-bucket/test.03.csv”

AWS 文档指出

您可以使用 dash 参数将文件流式传输到标准输入 (stdin) 或标准输出 (stdout)。

我不知道这对于打开的文件流是否可行。

有效的原始代码

LINECOUNT=300000
INFILE=s3://"${S3_BUCKET}"/"${FILENAME}"
OUTFILE=s3://"${DEST_S3_BUCKET}"/"${FILENAME%%.*}"

FILES=($(aws s3 cp "${INFILE}" - | split -d -l ${LINECOUNT} --filter "aws s3 cp - \"${OUTFILE}_\$FILE.csv\"  | echo \"\$FILE.csv\""))

这是我尝试向传出文件流添加变量,但它不起作用。

LINECOUNT=300000
INFILE=s3://"${S3_BUCKET}"/"${FILENAME}"
OUTFILE=s3://"${DEST_S3_BUCKET}"/"${FILENAME%%.*}"

HEADER=$(aws s3 cp "${INFILE}" - | head -n 1)

FILES=($(aws s3 cp "${INFILE}" - | split -d -l ${LINECOUNT} --filter "echo ${HEADER}; aws s3 cp - \"${OUTFILE}_\$FILE.csv\"  | echo \"\$FILE.csv\""))

相关内容