2015-04-23 36 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>围绕整个事件。

字段分隔符是一个或多个空格,后跟一个可选的#,因此注释前面的前导#被视为字段分隔符的一部分并被删除。

相关问题