bash - 从通配符中删除每个文件的第一行?

标签 bash scripting wildcard

我正在尝试将大约 100 个 CSV 复制到 PostgreSQL 数据库中。 CSV 的格式并不适合数据库,因此我必须进行一些编辑,我正在尝试通过管道即时进行编辑。

由于每个 CSV 文件都有一个 header ,因此我需要删除第一行以防止 header 作为实体复制到数据库中。

我的尝试如下:

sed -e "s:\.00::g" -e "s/\"\"//g" *.csv | tail -n +2 | cut -d "," -f1-109 |
psql -d intelliflight_pg -U intelliflight -c "\COPY flights FROM stdin WITH DELIMITER ',' CSV"

我遇到的问题是它将 *.csv 视为单个文件,并且仅删除它看到的第一个文件的第一行,并保留其余文件独自一人。

如何删除通过 *.csv 通配符检索的每个单独文件的第一行?

最佳答案

您可以组合 sed 和 tail 步骤并使用 find 进行每个文件处理,然后将其输出通过管道传输到 cut和psql:

find -name '*.csv' -exec sed '1d;s/\.00//g;s/""//g' {} \; | cut ...

这使用 sed 从每个文件中删除第一行,然后对其余文件进行替换。每个文件都会被处理,并将其输出全部通过管道传输到 cut 和其余命令。

注意 sed 参数周围的单引号,用引号稍微简化了事情。

这还会处理子目录中的 .csv 文件;如果你不想这样,你必须限制递归深度

find -maxdepth 1 -name etc.

关于bash - 从通配符中删除每个文件的第一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35494837/

相关文章:

r - 在命令行(终端)上使用 R 脚本的最佳方式是什么?

bash - 在 make clean 上使用通配符时如何修复 Makefile 语法错误?

scripting - dialog --buildlist 选项,如何使用?

c - Linux 上 C 中带有通配符条目的文件名

filter - Laravel,路由通配符过滤然后 Controller

regex - 在 Ubuntu 中使用重命名递归更改文件前缀,(正则表达式不起作用)

linux - 在 ctrl+c 上终止 bash 中的管道子进程

linux - 如何在 Linux 中安排作业和传递参数并并行运行

linux - bash/sh if 语句语法

html - 检查 file.html 是否存在的脚本,如果存在,则运行另一个脚本,否则会死吗?