¿Hay algún comando o conjunto de comandos que pueda usar para alinear horizontalmente líneas de texto con un carácter arbitrario? Por ejemplo, con una lista de direcciones de correo electrónico, la salida produciría un archivo de texto con todos los caracteres '@' alineados verticalmente.
Para tener éxito, creo que se debe agregar un número variable de espacios vacíos al comienzo de la mayoría de las líneas. No quiero columnas separadas, ya que requieren más esfuerzo para leer (por ejemplo, column -t -s "@" < file.txt
).
Antes de:
[email protected]
[email protected]
[email protected]
Después:
[email protected]
[email protected]
[email protected]
Dicho de otra manera: ¿puedo especificar que un carácter sea un punto de anclaje, alrededor del cual el texto circundante está centrado horizontalmente? Mi caso de uso para esto son las direcciones de correo electrónico, para que sean más fáciles de escanear visualmente.
fuente
@
símbolos?@
símbolos múltiples no deberían ser un problema con las direcciones de correo electrónico, pero un usuario debería poder seleccionar qué instancia de un carácter por línea será el 'ancla' alrededor del cual se centra el otro texto.@
permiten varios símbolos en las direcciones de correo electrónico, por ejemplotom"@brossmann"@example.com
. Por eso pregunté qué debería pasar si hay varios@
símbolos :).@
No se permiten múltiples símbolos en una variedad de servicios de correo electrónico. Es completamente razonable esperar correos electrónicos "normales" que se ajusten a un estándar más estricto que el "real", a menos que se trate de una entrada de usuario sin filtrar, en cuyo caso es más probable que trate con líneas sin@
.Respuestas:
NO Awk. Solo
sed
ycolumn
:Salida:
Ahora, en lo que pienso, esto es casi lo mismo que la solución de Sundeep ', solo parece más corto / tiene menos llamadas
sed
, y también supone que@
sucede solo una vez en cada línea.fuente
column -ts@ input.txt | sed -r 's/([^ ]+)( *)\s\s/\2\1@/'
En su forma más simple, puede imprimir el primer campo en un ancho de campo adecuadamente grande, por ejemplo
AFAIK cualquier método que no asuma un ancho de campo máximo específico requerirá mantener el archivo en la memoria o hacer dos pases.
fuente
cw=$(cut -d@ -f1 file | wc -L)
y luegoawk -v w="$cw" 'BEGIN{OFS=FS="@"} {$1 = sprintf("%*s", w, $1)} 1'
awk -F@ '{a[$1] = $2; w = length($1) > w? length($1) : w; next} END {for (i in a) printf("%*s%c%s\n", w, i, FS, a[i])}' INPUT-FILE.txt > OUT.txt
. Formateó bien el resto, pero faltan algunos datos.awk -F@ '{printf "%12s@%s\n", $1, $2}' input.txt
solución hacky, supone mucho sobre el texto de entrada
fuente
Una solución rápida de Python que utiliza la longitud de relleno más corta posible que alinea a la derecha todas las cadenas a la izquierda del separador:
Uso:
fuente
Otra solución GNU
awk
+column
:La salida:
fuente
Esto también puede funcionar con la manipulación de cadenas Bash.
Bash script (4.x):
El resultado:
fuente