我正在尝试将大约 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/