Probablemente el método más eficiente, si usted está utilizando la cáscara bash
(y que parecen ser, en función de sus comentarios), es el uso de la variante subcadena de la expansión de parámetros:
pax> long="USCAGol.blah.blah.blah"
pax> short="${long:0:2}" ; echo "${short}"
US
Esto configurará short
como los primeros dos caracteres de long
. Si long
es más corto que dos caracteres, short
será idéntico.
Este método en el caparazón generalmente es mejor si vas a estar haciéndolo mucho (como 50,000 veces por informe como mencionas) ya que no hay una sobrecarga de creación de proceso. Todas las soluciones que usan programas externos sufrirán por esa sobrecarga.
Si también quería asegurar una longitud mínima , usted podría almohadilla a cabo antes de la mano con algo como:
pax> long="A"
pax> tmpstr="${long}.."
pax> short="${tmpstr:0:2}" ; echo "${short}"
A.
Esto aseguraría que cualquier cosa menos de dos caracteres de longitud fue rellenada por la derecha con puntos (u otra cosa, simplemente cambiando el carácter utilizado al crear tmpstr
). No está claro que necesites esto, pero pensé que lo pondría para completarlo.
Una vez dicho esto, hay un número de maneras de hacer esto con programas externos (por ejemplo, si usted no tiene a su disposición bash
), algunos de los cuales son:
short=$(echo "${long}" | cut -c1-2)
short=$(echo "${long}" | head -c2)
short=$(echo "${long}" | awk '{print substr ($0, 0, 2)}'
short=$(echo "${long}" | sed 's/^\(..\).*/\1/')
Los primeros dos (cut
y head
) son idénticos para una cadena de una sola línea; básicamente, ambos simplemente le devuelven los dos primeros caracteres. Se diferencian en que cut
le dará los dos primeros caracteres de cada línea y head
le dará los dos primeros caracteres de la entrada completa
El tercero utiliza la función awk
sub-cadena para extraer los dos primeros caracteres y la cuarto usa sed
grupos de captura (usando ()
y \1
) para capturar los primeros dos caracteres y reemplazar la línea completa con ellos.Ambos son similares a cut
- entregan los primeros dos caracteres de cada línea en la entrada.
Nada de eso importa si está seguro de que su entrada es una sola línea, todas tienen un efecto idéntico.
Gracias a todos. Terminé usando 'cut -c1-2', sinceramente ni siquiera sabía que 'cut' estaba allí. Me gustaría decir que tengo mucha experiencia en la línea de comandos, pero aparentemente tengo mucho que aprender. – Greg
@Greg, solo tenga en cuenta que el corte se ejecuta como un proceso separado; será más lento que la solución de bash interna que publiqué junto a él en mi respuesta. Eso no hará ninguna diferencia a menos que esté procesando grandes conjuntos de datos, pero debe tenerlo en cuenta. – paxdiablo
[Editar] En realidad, creo que esta línea de código probablemente se ejecutará aproximadamente 50,000 veces por informe. Así que podría ir con el método interno de Bash, que como dijiste ahorrará algunos recursos muy necesarios. – Greg