2015-02-17 34 views
0

我有一個包含休耕的輸入文件test.txt輸出:如何着色AWK的根據條件

a 1 34 
f 2 1 
t 3 16 
g 4 11 
j 5 16 

我用awk只打印字符串2和3:

awk '{print $2 " " $3}' test.txt 

是否有辦法根據條件僅對輸出的第二個字符串進行着色,如果該值高於15,則打印爲橙色,如果該值高於20,則打印爲紅色。它會給出相同的顏色:

1 34(red) 
2 1 
3 16(orange) 
4 11 
5 16(orange) 

輸入可能包含更多不同順序的行。

+0

你問如何着色輸出字符串或者如何基於一個條件或兩個這樣做呢? – 2015-02-18 00:14:08

+0

我要求兩個,如果價值高於15,然後打印橙色,如果高於20,然後打印紅色,低於15,然後只是正常打印。 – raphy75 2015-02-18 00:18:53

回答

8

此awk命令應做你想做的事:

awk -v red="$(tput setaf 1)" -v yellow="$(tput setaf 3)" -v reset="$(tput sgr0)" '{printf "%s"OFS"%s%s%s\n", $1, ($3>20)?red:($3>15?yellow:""), $3, reset}' 

的密鑰比特這裏是

  • 使用tput得到設置顏色爲當前終端的正確表示(而不是硬編碼的特定轉義序列)
  • 使用-v到設置的變量的AWK命令使用來構造其輸出

上述腳本簡潔地寫入,但可以更小簡潔地寫成這樣的值:

{ 
    printf "%s"OFS, $1 
    if ($3 > 20) { 
     printf "%s", red 
    } else if ($3 > 15) { 
     printf "%s", yellow 
    } 
    printf "%s%s\n", $3, reset 
} 

編輯:Ed Morton正確地指出,通過使用color變量並將顏色選擇與打印分開,可以簡化上述awk程序。就像這樣:

awk -v red="$(tput setaf 1)" -v yellow="$(tput setaf 3)" -v reset="$(tput sgr0)" \ 
'{ 
    if ($3>20) color=red; else if ($3>15) color=yellow; else color="" 
    printf "%s %s%s%s\n", $1, color, $3, reset 
}' 
+1

+1 FWIW我會發現'if($ 3> 20)color = red;否則如果($ 3> 15)顏色=黃色; else color =「」; printf「%s%s%s%s \ n」,$ 1,color,$ 3,reset'clearer ... – 2015-02-18 14:20:54

+1

@EdMorton確實。我要指責那個「嚴格翻譯」的盲目性。 – 2015-02-18 14:22:37

+0

是的,它做的工作,這是相當長的,但我喜歡使用tput,我用它和它的完美,謝謝。 – raphy75 2015-02-19 23:12:21

3

你可以做到以下幾點:

awk '{printf "%s ", $2} 
    $3 > 15 {printf "\033[33m"} 
    $3 > 20 {printf "\033[31m"} 
    {printf "%s\033[0m\n", $3}' test.txt 

不幸的是,我不知道橙色ANSI轉義代碼...

另一種方法:

awk -v color1="\033[33m" -v color2="\033[31m" -v reset="\033[0m" ' 
    $3 > 15 && $3 <= 20 {$3=color1 $3 reset} 
    $3 > 20 {$3=color2 $3 reset} 
    {print $2, $3}' test.txt 
+0

我喜歡你的,因爲它非常簡單,並且易於在管道後面添加,這要感謝這個命令。 – raphy75 2015-02-19 23:13:43

1
awk '{if($2>15 && $2<=20){$2="\033[1;33m" $2 "\033[0m"};if($2>20){$2="\033[1;31m" $2 "\033[0m"};print}' file 

擊穿

($2>15 && $2<=20){$2="\033[1;33m" $2 "\033[0m"} # if field 2>15 and =<20, then add colour code to field 2. 

if($2>20){$2="\033[1;31m" $2 "\033[0m"} ## if field 2>20, then add colour code to field 2. 

print #print line afterwards 
+0

這個也很好,有趣的是,不同的方式導致了相同的結果。 – raphy75 2015-02-19 23:15:37