2015-04-23 50 views
0

以下是「輸入」文件的內容閱讀從以下文件中的每個值,並提取每個值

125.125.125.125 abcde abcde.com #comments 

126.126.126.126 efg efg.com #comments 

產量預計爲

​​

下面是我寫

腳本
for line in input 
    do 
      f1=$(echo $line |awk '{print $1}') 
      f2=$(echo $line |awk '{print $2}') 
      f3=$(echo $line |awk '{print $3}') 
      f4=$(echo $line |awk -F# '{print $2}') 
      echo '<tr>' 
      echo '<td>'$f1'</td>' 
      echo '<td>'$f2'</td>' 
      echo '<td>'$f3'</td>' 
      echo '<td>'$f4'</td>' 
      echo '</tr>' 
    done 

關於高效代碼的任何建議?

回答

0

您可以使用sed

echo '125.125.125.125 abcde abcde.com #comments' \ 
| sed -re 's=(.*) (.*) (.*) #(.*)=<tr>\n<td> \1 </td>\n<td> \2 </td>\n<td> \3 </td>\n<td> \4 </td>\n</tr>=' 

或Perl:

echo '125.125.125.125 abcde abcde.com #comments' \ 
| perl -lane '$F[3] =~ s/^#//; 
       print "<tr>\n<td> ", 
       join(" </td>\n<td> ", @F), 
       " </td>\n</tr>"' 
1

而不是使用awk來提取每個領域,只是用它做整個事情:

$ awk -F' +#?' 'NF{print "<tr>";for(i=1;i<=NF;++i)printf "<td>%s</td>\n",$i;print "</tr>"}' file 
<tr> 
<td>125.125.125.125</td> 
<td>abcde</td> 
<td>abcde.com</td> 
<td>comments</td> 
</tr> 
<tr> 
<td>126.126.126.126</td> 
<td>efg</td> 
<td>efg.com</td> 
<td>comments</td> 
</tr> 

NF條件確保線路空白時不會有輸出(即NF是0)。對於其他每一行,循環遍歷字段,在<td>...</td>內打印每個字段,其中<tr>...</tr>圍繞整個事件。

字段分隔符是一個或多個空格,後跟一個可選的#,因此註釋前面的前導#被視爲字段分隔符的一部分並被刪除。

相關問題