2014-10-29 40 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