2014-10-29 107 views
0

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

它将使生活更轻松,当我想通过同时运行ssh它(引用它总是一个地狱)的管道输出来运行它,当然它会让生命一般容易。

我现在的黑客有100个局限性是:

function _printcol(){ 
    while read data; do 
     [ -z "$fields" ] && fields=`for num in "[email protected]"; 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,...)。

+1

你列出几个的“100个限制”,你与你的当前功能见/别名吗? (除了这个事实可以大大简化。) – John1024 2014-10-29 20:19:37

回答

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

谢谢! 1)没有意识到函数内部的awk默认会读取stdin;因此'while read data'循环。 2)循环内的重要事情,因为我读了某处,如果你想从标准输入读取,'read'必须是函数中的第一个语句。 3)的想法是为每个分隔符/分隔符创建一个别名,在我给出的示例中不需要。 – Kashyap 2014-10-31 16:06:10

+0

虽然正确的答案是'没有这样的命令',你的答案是最有帮助的。 – Kashyap 2014-10-31 16:09:03

1

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

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

调用它就像你正在做的:

ls -ltr | printcol 1 9