用于从输入中打印特定列的命令

时间:2014-10-29 20:04:15

标签: linux awk sed gnu multiple-columns

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

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

我当前有100个限制的黑客是:

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,......)。

2 个答案:

答案 0 :(得分:2)

重写

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将读取函数的stdin:你不必捕获它并将其输入awk - 优点:只有一个awk调用,而不是每行一个。
  • 您不需要对字段列表进行任何粗略的预处理。特别是,你为什么要在里面进行while循环?
  • 为什么使用函数作为别名?

答案 1 :(得分:1)

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

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

像你一样调用它:

ls -ltr | printcol 1 9