从通配符中删除每个文件的第一行?
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
进行每个文件处理,然后将其输出通过管道传输到 cut
和 psql
:
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 之后的任何字段。
我正在尝试将大约 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.
现在无法测试,但应该可以:
awk -F, '
FNR == 1 {next}
{
gsub(/\.00/, "")
gsub(/""/, "")
NF = 109
print
}
' *.csv | psql ..
NF= 109
行将删除 109 之后的任何字段。