Estoy tratando de hacer eco del resultado de un comando sed en un archivo .html diferente. El comando sed es leer un archivo .txt línea por línea y tomar solo el segundo valor separado por un delimitador de coma.

Esto es lo que tengo:

ind=1
while [ $ind -lt 4 ]
do
     echo "<tr><td>" >> ${HTML_FILE}
     echo "`sed -n '$ind p' ${TEXT_FILE} | awk -F ',' '{print $2}'`" >> ${HTML_FILE}
     echo "</td></tr>" >> ${HTML_FILE}
     ind=$((ind+1))
done

El contenido de $ {TEXT_FILE}:

709A8, Text 1 | 34%
354Y7, Text 2 | 86%
F1065, Text 3 | 100%

Cuando ejecuté mi código, aquí está mi salida. Por alguna razón, imprime 'nd p':

<tr><td>
 nd p
</td></tr>
<tr><td>
 nd p
</td></tr>
<tr><td>
 nd p
</td></tr>

La salida esperada debería ser algo como:

<tr><td>Text 1 | 34%</td></tr>
<tr><td>Text 2 | 86%</td></tr>
<tr><td>Text 3 | 100%</td></tr>
1
KAYLE 13 sep. 2018 a las 17:18

3 respuestas

La mejor respuesta

O simplemente awk:

awk -F, 'NR < 4 {print "<tr><td>" $2 "</td></tr>"}' "$TEXT_FILE" >> "$HTML_FILE"
4
glenn jackman 13 sep. 2018 a las 15:18

Con GNU sed. Cambié de s/// a s||| y de expresiones regulares a expresiones regulares extendidas (-r).

sed -r 's|^[^,]*, (.*)|<tr><td>\1</td></tr>|' file

Salida:

<tr><td>Text 1 | 34%</td></tr>
<tr><td>Text 2 | 86%</td></tr>
<tr><td>Text 3 | 100%</td></tr>
2
Cyrus 13 sep. 2018 a las 14:29

Como mínimo, abandone sed y awk por completo. Ejecutarlos una vez para cada línea es exagerado.

ind=1
while [ "$ind" -lt 4 ]
do
     IFS=, read _ x _
     echo "<tr><td>$x</td></tr>"
     ind=$((ind+1))
done < "$TEXT_FILE" >> "$HTML_FILE"
1
chepner 13 sep. 2018 a las 14:45