¿Imprimir columnas de una línea específica de archivo?

Estoy viendo archivos que tienen un número de versión diferente que comienza en la columna 18 de la línea 7.

¿Cuál es la mejor manera con Bash para leer (en una variable $) la cadena en la línea 7, desde la columna, es decir, "carácter", 18 hasta el final de la línea? ¿Qué hay del quinto al último carácter de la línea?

preguntado el 12 de junio de 12 a las 18:06

¿Por "columnas" quiere decir "caracteres" o "campos"? -

Caracteres. Lo sentimos, TextMate las llama columnas. -

@DennisWilliamson Sí, "personajes". -

4 Respuestas

sed camino:

variable=$(sed -n '7s/^.\{17\}//p' file)

EDITAR (gracias a los comentaristas): si por columnas te refieres a campos (separados con tabulaciones o espacios), el comando se puede cambiar a

variable=$(sed -n '7s/^\(\s\+\S\+\)\{17\}//p' file)

Respondido el 12 de junio de 12 a las 19:06

Eso es 17/18 personajes. Me pregunto de los medios OP campos cuando dice "columnas". - dennis williamson

@Dennis Editado en caso de que no haya entendido bien la pregunta. - lev levitsky

@William Gracias, no conocía esa bandera. - lev levitsky

sed -n '7s/^.\{17\}//p' file ¡obras! :) sed -nr '7s/^(\s+\S+){17}//p' file no funciona para mi: sed: illegal option -- r. - ma11hew28

@MattDiPasquale Se puede hacer sin -r, solo con más barras (ver la actualización). Sin embargo, si el primer comando funciona, entonces el segundo no hará lo que espera: está diseñado para un archivo con columnas separadas por tabuladores o espacios de ancho variable. - lev levitsky

Tiene varias formas diferentes de hacerlo, según las utilidades que desee utilizar. Una de sus opciones es hacer uso de la expansión de subcadenas de Bash de cualquiera de las siguientes maneras:

SED

line=1
string=$(sed -n "${line}p" /etc/passwd)
echo "${string:17}"

awk

line=1
string=$(awk "NR==${line} {print}; {next}" /etc/passwd)
echo "${string:17}"

coreutils

line=1
string=`{ head -n $line | tail -n1; } < /etc/passwd`
echo "${string:17}"

Respondido el 12 de junio de 12 a las 18:06

Utiliza

var=$(head -n 17 filename | tail -n 1 | cut -f 18-)

or

var=$(awk 'NR == 17' {delim = ""; for (i = 18; i <= NF; i++) {printf "%s%s", delim, $i; delim = OFS}; printf "\n"}')

Si te refieres a "caracteres" en lugar de "campos":

var=$(head -n 17 filename | tail -n 1 | cut -c 18-)

or

var=$(awk 'NR == 17' {print substr($0, 18)}')

Respondido el 12 de junio de 12 a las 19:06

Si por 'columnas' te refieres a 'campos':

a=$( awk 'NR==7{ print $18 }' file )

Si realmente desea el byte 18 hasta el final de la línea 7, haga lo siguiente:

a=$( sed -n 7p | cut -b 18- )

Respondido el 12 de junio de 12 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.