【问题标题】:head: illegal option -- q头:非法选项--q
【发布时间】:2021-09-26 12:46:01
【问题描述】:

尝试使用 head -n 1 *.csv | awk -F, '{print NF}' 计算目录中 csv 文件中的列数

由于head 首先打印文件名,因此会产生许多零。试过head -q -n 1 *.csv,它通常适用于标准 Linux 服务器,但在这里(本地 Mac)我得到:

head: illegal option -- q
usage: head [-n lines | -c bytes] [file ...]

很有趣,在man head 中,我什至不认为-q 是一个有效的论点。

有什么想法吗?

【问题讨论】:

    标签: bash macos shell terminal


    【解决方案1】:

    那是因为它不是法律论据。

    POSIX 标准详细说明了关键程序(如 head、tail 和大部分 binutils)需要哪些命令行标志,而 GNU 组织偶尔会添加超出标准的附加标志。

    这是一个额外的“-q”安静标志,它不是 POSIX 标准的一部分,而是 GNU 产品的一部分,并且您已经进入了一个不使用 GNU 实用程序产品的平台。

    我建议你只是围绕它编写脚本,或者使用 grep 等管道来只保留你需要的行。

    【讨论】:

    • 幸运的是,这些问题并不多。祝你好运。
    • 或安装gawk
    • @markp-fuso 虽然这对于控制自己平台的人来说是一个选项,但在编写可移植脚本时,这些选项与他们解决的问题一样有问题,如果不是更多的话。了解一下便携式 bash 是个好主意,即使现​​在不需要它,因为有一天可能会在没有时间开发它的时候需要它。
    • 天啊...谢谢@Edwin Buck。是的,这是我第一次遇到这样的事件。根据您的回复,我使用 grep 来解决这个问题。 head -n 1 *.csv | grep -v "==>" |grep -v -e '^$'|awk -F, '{print NF}'
    • omg... 作为一种习惯,当一个人可以处理整个链的逻辑时,尽量不要像这样链接程序。对于小任务来说,这没什么大不了的,但是当您已经调用awk 时,为什么还要生成一个head 和两个 greps? awk 通常会从所有这些中做任何你想做的事情。另外,请仔细查看您的逻辑; head 不注意一条记录的内容,只是在第一行之后退出,但是在awk 接收数据之前,您有 两个 grep 排除行。这可能正是您想要的,但最好将您的逻辑写在awk 中以便清楚。
    【解决方案2】:

    其他人已经在另一个答案中解释了为什么它不起作用。这是一个可移植的解决方法:

    awk -F, 'FNR==1 {print NF}' *.csv
    

    【讨论】:

    • 谢谢!虽然它比 grep 慢。为什么会是这个原因?
    • @GavrielGoidel 一个缓慢的 awk 实现。试试awk -F, 'FNR==1 {print NF; nextfile}' *.csv 看看它是否有效/有帮助,我不确定macos awk 是否支持nextfile
    • 这样更快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多