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

时间:2016-02-18 23:54:48

标签: bash scripting wildcard

我正在尝试将大约100个CSV复制到PostgreSQL数据库中。 CSV并不是完美的数据库形成的,所以我必须进行一些编辑,我正在尝试用管道进行动态操作。

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

我对此的尝试如下:

SELECT GROUP_CONCAT(CASE WHEN COLUMN_NAME = 'col1' THEN TABLE_NAME END) as `col1`,
       GROUP_CONCAT(CASE WHEN COLUMN_NAME = 'col2' THEN TABLE_NAME END) as `col2`,
       GROUP_CONCAT(CASE WHEN COLUMN_NAME = 'col3' THEN TABLE_NAME END) as `col3`
  FROM
INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME like "myView%";

我遇到的问题是,它将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" 视为单个文件,只删除它看到的第一个文件的第一行,并保留其余文件。< / p>

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

2 个答案:

答案 0 :(得分:2)

您可以合并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.

答案 1 :(得分:2)

目前无法测试,但应该这样做:

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

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