从下面的文件中读取每个值并提取每个值

时间:2015-04-23 11:45:52

标签: bash awk

以下是文件"输入"

的内容
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

有关高效代码的任何建议吗?

2 个答案:

答案 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>"'