【问题标题】:how to remove both first and last line of csv file using sed如何使用 sed 删除 csv 文件的第一行和最后一行
【发布时间】:2017-11-14 04:45:44
【问题描述】:

我可以删除以myfile 开头的 csv 文件的第一行并使用以下方法合并它们:

sed 1d myfile*.csv > myfile_merged.csv

我还想删除 csv 文件的最后一行。

我试过了:

sed 1d -i '$d' myfile*.csv > myfile_merged.csv

但得到错误:

sed: can't read $d: No such file or directory

【问题讨论】:

    标签: bash csv sed


    【解决方案1】:

    问题是这个命令:

    sed 1d -i '$d' myfile*.csv > myfile_merged.csv
    

    sed 中的-i内联替换)之后不需要有参数,否则它会被视为 SUFFIX 以创建内联替换的备份。

    你需要的是这个gnu sed 命令:

    sed -i '1d;$d' myfile*.csv
    

    这将删除每个匹配文件中的第一行和最后一行并将其保存到位。

    【讨论】:

    • 仅供参考,这也可以使用非 GNU sed 来实现。对于 BSD sed,唯一的区别是您需要为 optarg 提供一个空字符串,例如:sed -i '' '1d;$d' *.csv。虽然我认为这不是 OP 想要的。
    • 是的,我知道这一点,因为我在 OSX 上工作。虽然-i '' 会给gnu sed 报错,所以我更喜欢适当的后缀,即sed -i.bak '1d;$d' *.csv,它适用于sed 的两个版本。
    【解决方案2】:

    你可能想要做的是:

    sed -e '1d' -e '$d' myfile*.csv > merged.csv
    

    但这不起作用,因为它告诉 sed 删除所有文件的第一行和最后一行,而不是每个文件。换句话说,您将剥离第一个文件的第一行,以及最后一个文件的最后一行……就是这样。

    要单独处理每个文件,您可能需要单独处理每个文件..。 :)

    for f in myfile*.csv
        sed -e '1d;$d' "$f"
    done > merged.csv
    

    请注意,虽然这将在 bash 中运行,但它也与 POSIX 兼容(shell 和 sed 部分)。而且它不关心你的输入是CSV还是其他格式,只要可以使用sed逐行解析即可。

    【讨论】:

    • 不确定是否某些版本没有,但您可以使用-s 选项为每个输入文件设置单独的地址
    • @Sundeep,是的,-s 选项是 GNUism。我故意让事情更便携,特别是当(就像这里的情况一样)我们不知道 OP 的操作系统时。
    猜你喜欢
    • 2016-11-06
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2017-11-28
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多