以下是文件"输入"
的内容125.125.125.125 abcde abcde.com #comments
126.126.126.126 efg efg.com #comments
预期输出
<tr>
<td> 125.125.125.125 </td>
<td> abcde </td>
<td> abcde.com </td>
<td> comments </td>
</tr>
以下是我写的脚本
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 :(得分: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>
。
字段分隔符是一个或多个空格,后跟可选的#
,因此注释前的前导#
将被视为字段分隔符的一部分并被删除。
答案 1 :(得分: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>"'