【问题标题】:Removing the first line of each file from a wildcard?从通配符中删除每个文件的第一行?
【发布时间】:2016-02-18 23:54:47
【问题描述】:

我正在尝试将大约 100 个 CSV 复制到 PostgreSQL 数据库中。 CSV 没有完美地为数据库形成,所以我必须做一些编辑,我试图通过管道即时进行。

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

我的尝试如下:

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 通配符检索到的每个文件的第一行?

【问题讨论】:

    标签: bash scripting wildcard


    【解决方案1】:

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

    【讨论】:

    • 当我运行它时,我得到:find: missing argument to: '-exec'
    • @Ephraim 抱歉,刚刚更新删除了不必要的 find
    • 这仍然会从后续文件中保留第一行。它正在删除第一个文件的第一行,但不会从其余文件中删除。
    • 告诉您我正在 Windows 上执行此操作也可能很有用。我不知道通配符在linux中的工作方式是否不同
    • 好的,我在cygwin中运行过,运行起来好像没有问题。不太确定为什么它在使用 Ruby 和 Rails 的命令提示符中给我一个错误,但您的解决方案有效。现在我只需要弄清楚如何让 psql 在 cygwin 上运行。
    【解决方案2】:

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

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

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

    【讨论】:

    • 第一个gsub有多余的空间?
    • 好的,谢谢。我在手机上输入了它,我的键盘喜欢在任何地方添加空格。
    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多