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

Removing the first line of each file from a 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 进行每个文件处理,然后将其输出通过管道传输到 cutpsql

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

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

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

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

find -maxdepth 1 -name etc.

现在无法测试,但应该可以:

awk -F, '
    FNR == 1 {next} 
    {
        gsub(/\.00/, "")
        gsub(/""/, "") 
        NF = 109
        print
    } 
' *.csv | psql .. 

NF= 109 行将删除 109 之后的任何字段。