【问题标题】:Command to print specific column from input从输入打印特定列的命令
【发布时间】:2014-10-29 20:04:14
【问题描述】:

我想知道是否有一些内置的 else 命令可以从输入中打印第 N 列。例如。 awk '{print $2}'cut...

如果我想在管道输出上运行它,同时通过ssh 运行它(引用它总是地狱),它会让生活更轻松,当然它总体上会让生活更轻松。

我目前有 100 个限制的 hack 是:

function _printcol(){
    while read data; do
        [ -z "$fields" ] && fields=`for num in "$@"; do echo -n "\"\t\",\\$$num"; done`
        echo $data | awk "{ print $fields }"
    done
}
alias printcol=_printcol
ls -ltr | printcol 9
ls -ltr | printcol 1 9

我想知道是否有人已经实现了它。我希望它是内置的,或者尽可能广泛地使用(比如在多个股票发行版上),或者在最坏的情况下易于安装(比如 yum、apt、...)。

【问题讨论】:

  • 您能列出您在当前函数/别名中看到的“100 个限制”中的几个吗? (除了它可以大大简化的事实。)

标签: linux awk sed gnu multiple-columns


【解决方案1】:

重写

printcol() {
    awk -v "fields=$*" '
        BEGIN { n = split(fields, f) }
        {
            for (i=1; i<=n; i++) {
                printf "%s%s", $(f[i]), OFS
            }
            print ""
        }
    '
}

seq 50 | pr -T5 | printcol 2 4 5

注意事项:

  • awk 将读取函数的标准输入:您不必捕获它并将其输入到 awk 中——优点:仅一次 awk 调用,而不是每行一次。
  • 您不需要对字段列表进行任何粗略的预处理。特别是,为什么要在 while 循环中这样做?
  • 为什么要使用函数别名?

【讨论】:

  • 谢谢! 1) 没有意识到函数内部的 awk 默认也会读取标准输入;因此while read data 循环。 2)循环内的毛病因为我在某处读到read必须是函数中的第一个语句,如果你想从标准输入读取。 3) 想法是为每个分隔符/分隔符创建一个别名,在我给出的示例中不需要。
  • 虽然正确答案是“没有这样的命令”,但你的答案是最有帮助的。
【解决方案2】:

您想要一些易于安装的东西。只需将以下行放入您的 ~/.bashrc 文件中:

 printcol() { fields=$(printf '$%i,' "$@"); awk -v OFS='\t' "{ print ${fields%%,} }"; }

就像你在做的那样调用它:

ls -ltr | printcol 1 9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2016-12-06
    • 2021-07-05
    相关资源
    最近更新 更多