Tengo un archivo f1.txt
:
ID Name
1 a
2 b
3 g
6 f
El número de espacios no es fijo. ¿Cuál es la mejor manera de reemplazar todos los espacios en blanco con un espacio usando solo tr
?
Esto es lo que tengo hasta ahora:
cat f1.txt | tr -d " "
Pero el resultado es:
IDName
1a
2b
3g
6f
Pero quiero que se vea así:
ID Name
1 a
2 b
3 g
6 f
Por favor intente y evite sed
.
sed
. Quería conocer otras formasRespuestas:
Con
tr
, use la opción de repeticións
queeze :O puedes usar una
awk
solución:Cuando cambia un campo en el registro, la
awk
reconstrucción$0
, toma todos los campos y los une, separados porOFS
, que es un espacio por defecto.Eso exprimirá secuencias de espacio y pestañas (y posiblemente otros caracteres en blanco según la configuración regional y la implementación de
awk
) en un espacio, pero también eliminará los espacios en blanco iniciales y finales de cada línea.fuente
awk
, puede hacer cualquier cosa. También puedes aceptar su solución. Solo una cosa: Gnouc, ¿podrías explicar qué hace el formato awk en tu comando? ¿También puede agregar tabulaciones / espacios para que la salida se ajuste a la salida esperada de Unknown?column -t
hace. Añadir explicación paraawk
.tr
reemplazará dos espacios al final de una línea con un solo espacio.awk
eliminará todos los espacios finales.Solo usa
column
:Salida:
fuente
column -t f1.txt | cut -d " " -f2
Pero no era una solución que esperabacolumn -t file | awk '{print $2}'
imprime solo la segunda columnaSi desea exprimir el "espacio en blanco", querrá usar los juegos de caracteres predefinidos de tr ": blank:" (pestaña y espacio en blanco horizontal) o ": space:" (espacio en blanco vertical):
Se ejecutaron ejemplos en Red Hat 5 (GNU tr).
En mi caso, quería normalizar todo el espacio en blanco en un solo espacio para poder confiar en el espacio como emisor.
Como lo señaló el segundo comentario de dastrobu, me perdí la redacción en la página del manual:
Esto nos permite eliminar el primer tr. Kudo debe buscar sus paciencia frente a mi densidad.
Antes, análisis del puerto desde la configuración de Redis. archivo:
Después, con SET2 se especifica con la compresión:
Salida:
Para más detalles sobre los matices del espacio en blanco
Demuestre dónde solo se produce un apretón cuando intervienen sucesivos caracteres mixtos que entran en la clase de caracteres [: blank:]:
Nota: Mis dos campos de cadena en el formato printf están separados por 1 espacio, 1 pestaña, 1 espacio. Después de la compresión, esta secuencia todavía existe. En la salida del volcado Octal, esto se representa mediante la secuencia ascii 040 011 040.
fuente
tr "[:blank:]" " " | tr -s "[:blank:]"
? Supongo que la primera parte será suficiente, es decir,tr "[:blank:]" " "
ya que normaliza los espacios en blanco y ya realiza la sustitución. Desde la página de manual: "Apriete múltiples ocurrencias de los caracteres [...] Esto ocurre después de que se completa toda la eliminación y traducción".printf 'ID \t Name\n' | tr -s "[:blank:]" " " | od -cb
(como lo sugirió @dastrobu) y obtuveID Name\n
(con un espacio) como salida. ¿Realmente lo intentaste @ user3183018?printf 'ID␣\t␣Name\n' | tr -s "[:blank:]" "␣"
(como lo sugirió @dastrobu), donde␣
representa un espacio, y obtuveID␣Name\n
(con un espacio) como salida. Esto es exactamente igual a su ejemplo de "Puerto <ESPACIO> <TAB> <ESPACIO> 6379", excepto que utilicé las cadenas de encabezado de la pregunta. Me pregunto si lo intentastetr -s "[:blank:]"
(sin el"␣"
argumento final ).printf 'ID \t Name\n' | od -cb
, muestra exactamente lo que se supone que debe:I
D
\t
N
a
m
e
\n
(es decir,I
D
040
011
040
N
a
m
e
\n
). Mientras tanto, por su propia evidencia, está cometiendo exactamente el error que supuse que estaba: está ejecutandotr -s "[:blank:]"
(es decir,tr
con una opción y un argumento), en lugar del comando que @dastrobu y yo hemos presentado cuatro veces:tr -s '[:blank:]' '␣'
(es decir,tr
con una opción y dos argumentos ).¿Quién necesita un programa (que no sea el shell)?
Si desea que los valores en la segunda columna se alineen, como en la
column
respuesta del polimero , use enprintf
lugar deecho
:fuente
tr
la invocación, lo que sin mencionar cuánto más trabajo lleva escribir. Por último, ¿no diría que esta publicación en realidad no responde la pregunta como se le preguntó? ¿Cuál es la mejor manera de reemplazar todos los espacios en blanco con un espacio usando solo tr?$IFS
? Tal vez comoIFS=' <tab>' set -f ; echo $(cat <file)
:?Esta es una pregunta vieja y resuelta muchas veces. Solo para completar: tuve un problema similar, pero quería pasar líneas a través de la tubería a otro programa. Yo usé xargs .
por lo que
cat f1.txt | xargs -L1
parece salida de exactamente lo que quiere.fuente