2016-01-21 86 views
1

TL; DR - 我有一個變量,看起來像格式說明符($ TEMP),我需要使用awk printf。awk自定義printf命令生成

因此,通過這樣做:

awk '-v foo="$temp" {....{printf foo} else {print $_}}' tempfile1.txt > tmp && mv tmp tempfile1.txt 

猛砸應該看到這一點:

awk '{.....{printf "%-5s %-6s %...\n", $1, $2, $3....} else {print $_}}' tempfile1.txt > tmp && mv tmp tempfile1.txt 

樣品輸入:

col1  col2   col3 
aourwyo5637[dfs] 67tyd 8746.0000 
tomsd - 4 
o938743[34* 0 834.92 
. 
. 
. 

預期輸出:

col1    col2   col3 
aourwyo5637[dfs] 67tyd  8746.0000 
tomsd    -   4 
o938743[34*  0646sggg  834.92 
. 
. 
. 

長版

我是新手腳本,經過5個多小時的互聯網衝浪,做了我認爲是拼湊的信息,我碰到了一堵磚牆。

場景:

所以,我有我需要在目錄中打開多個隨機表。由於我不知道任何關於給定的表格,除了我需要格式化所有在第4行的數據和文件的第14行之後的所有行。

我需要在awk中快速創建一個自定義的printf命令,這樣每列的填充等於一個值(比如說5個空格),所以一旦我打開它,表格看起來很漂亮。

這是我想出迄今:

awk '{ 
     for (i=1;i<=NF;i++) 
     { 
      max_length=length($i); 
      if (max_length > linesize[i]) 
       { 
        linesize[i]=max_length+5; 
       } 
     }} 
     END{ 
      for (i = 1; i<=length(linesize); i++) 
      { 
       print linesize[i] >> "tempfile1.txt"  
      } 
    }' file1.txt 

# remove all blank lines in tempfile1.txt 
awk 'NF' tempfile1.txt > tmp && mv tmp tempfile1.txt 
# Get number of entries in tempfile1.txt 
n=`awk 'END {print NR}' tempfile1.txt` 
# This for loop generates the pattern I need for the printf command 
declare -a a 
for((i=0;i<$n;i++)) 
do 
    a[i]=`awk -v i=$((i+1)) 'FNR == i {print}' tempfile1.txt` 
    temp+=%-${a[i]}s' ' 
    temp2+='$'$((i+1))', ' 
    #echo "${a[$i]}"; 
    #echo "$sub" 
done 
temp='"'${temp::-2}'\n", ' 
# echo "$temp" 
temp=$temp${temp2::-2}'' 
# echo "$temp" 

awk <something here> 
# Tried the one below and it gave an error 
awk -v tem="$temp" '{printf {tem}} 

所以最好我想什麼是awk命令是簡單地把bash的變量temp awk命令看起來像這樣。

因此,通過這樣做:

awk '-v foo="$temp" {if(FNR >=14 || FNR == 4) {printf foo} else {print $_}}' tempfile1.txt > tmp && mv tmp tempfile1.txt 

猛砸應該看到這一點:

awk '{if(FNR >=14 || FNR == 4) {printf "%-5s %-6s %...\n", $1, $2, $3....} else {print $_}}' tempfile1.txt > tmp && mv tmp tempfile1.txt 
+1

編輯您的問題以包含示例輸入和預期輸出,以便我們可以開始幫助您。閱讀由Arnold Robbins撰寫的第4版有效Awk編程(Effective Awk Programming)一書,與通過使用單個搜索結構來學習awk相比,您將浪費的時間要少得多。 –

+1

@EdMorton:會查找你提到的那本書。 –

+1

您似乎在重新創建'column -t filename' –

回答

1

這聽起來像這可能是你想要什麼,但它仍然很難從你的問題告訴:

$ cat tst.awk 
BEGIN { OFS=" " } 
NR==FNR { 
    for (i=1;i<=NF;i++) { 
     width[i] = (width[i] > length($i) ? width[i] : length($i)) 
    } 
    next 
} 
{ 
    for (i=1;i<=NF;i++) { 
     printf "%-*s%s", width[i], $i, (i<NF?OFS:ORS) 
    } 
} 

$ awk -f tst.awk file file 
col1    col2 col3 
aourwyo5637[dfs] 67tyd 8746.0000 
tomsd    -  4 
o938743[34*  0  834.92 

我把它從你的問題的樣本輸入中刪除所有的僞造後.秒。

0
# Tried the one below and it gave an error 
awk -v tem="$temp" '{printf {tem}} 
  • '在線的端缺少
  • {tem}是錯誤的;只寫tem
  • printf,EXPR列表缺少
  • \n缺少

更正:

awk -v tem="$temp" "{printf tem\"\n\", $temp2 0}" 

awk "{printf \"$temp\n\", $temp2 0}" 

(簡單)。