Tengo archivos de texto de varias líneas de datos (a veces) delimitados por tabuladores. Me gustaría generar el archivo para poder echarle un vistazo, por lo que me gustaría ver solo los primeros 80 caracteres de cada línea (diseñé el archivo de texto para poner primero las cosas importantes en cada línea).
Pensé que podría usar cat para leer cada línea del archivo y enviar cada línea al siguiente comando en una tubería:
cat tabfile | cut -c -80
Pero eso parecía roto. Intenté hacer un poco de juego, y grep parecía funcionar, pero luego descubrí que no, no lo hizo (no todas las líneas del archivo tenían más de 80 caracteres), parece que las pestañas se cuentan como caracteres individuales por corte.
Lo intenté:
cat tabfile | tr \t \040 | cut -c -80
Aunque eso alteraría un poco mis datos, al eliminar la legibilidad de los espacios en blanco. Pero eso no funcionó. Tampoco lo hizo:
cat tabfile | tr \011 \040 | cut -c -80
Tal vez estoy usando tr mal? He tenido problemas con tr antes, queriendo eliminar múltiples espacios (parece que la versión de tr a la que tengo acceso en esta máquina tiene una opción -s para apretar varios caracteres; es posible que deba jugar más)
Estoy seguro de que si me equivoco podría usar perl, awk o sed, o algo para hacer esto.
Sin embargo, me gustaría una solución que utilice comandos regulares (POSIX?), Para que sea lo más portátil posible. Si termino usando tr, probablemente intente convertir las pestañas en caracteres, tal vez haga un cálculo, corte el cálculo y luego vuelva a convertir esos caracteres en pestañas para la salida.
No necesita ser una sola línea / ingresada directamente en la línea de comando; un script está bien.
Más información sobre archivos de pestañas:
Utilizo la pestaña para dividir campos, porque algún día querré importar datos en algún otro programa. Así que tiendo a tener solo una pestaña entre las piezas de contenido. Pero también utilizo pestañas para alinear cosas con columnas verticales, para ayudar en la legibilidad al mirar el archivo de texto sin formato. Lo que significa que, para algunos fragmentos de texto, relleno el final del contenido con espacios hasta llegar a donde funcionará la pestaña para alinear el siguiente campo con los que están arriba y debajo.
DarkTurquoise # 00CED1 Mares, cielos, botes de remos Naturaleza MediumSpringGreen # 00FA9A Útil para árboles Magic Lima # 00FF00 Solo para uso en pollos de primavera y fru $
fuente
pr
decoreutils
:pr -1 -t -l200 -W80 file
. Aumente / disminuya la longitud de la página (número después-l
) según su necesidad.Respuestas:
Creo que estás buscando
expand
y / ounexpand
. Parece que está tratando de asegurarse de que un\t
ancho ab cuente como 8 caracteres en lugar del único.fold
también lo hará, pero ajustará su entrada a la siguiente línea en lugar de truncarla. Creo que quieres:expand
yunexpand
se especifican ambos POSIX :expand
utilidad escribirá los archivos o la entrada estándar en la salida estándar con\t
caracteres ab reemplazados por uno o más caracteres de espacio necesarios para rellenar la siguiente tabulación. Cualquier carácter de retroceso se copiará en la salida y hará que se disminuya el recuento de posición de columna para los cálculos de tabulación; el recuento de la posición de la columna no se disminuirá por debajo de cero.Bastante simple. Entonces, aquí hay un vistazo a lo que esto hace:
El
until
bucle en la parte superior obtiene un conjunto de datos como ...Es
printf
esto con el%*s
indicador de relleno arg para que cada uno de los que están en el conjuntoprintf
rellene con tantos espacios como sea posible en el número del argumento. A cada uno le agrega un\t
carácter ab.Todos los
tee
s se utilizan para mostrar los efectos de cada filtro a medida que se aplica.Y los efectos son estos:
Esas filas están alineadas en dos conjuntos como ...
printf ...; echo
tr ...
oexpand
cut
wc
Las cuatro filas superiores son los resultados del
tr
filtro, en el que cada\t
ab se convierte en un solo espacio .Y los últimos cuatro los resultados de la
expand
cadena.fuente
Dado que las pestañas son más de alineación que de delimitación, una forma podría ser usar
column
y luegocut
:Parece
column
que no es POSIX. Es parte de las utilidades BSD en Ubuntu, así que supongo que es bastante multiplataforma.fuente
column
esta forma, OP ni siquiera necesitaría agregar espacios manualmente para alinearse.La sugerencia de Don en los comentarios fue un buen comienzo.
Esto es lo que necesitaba para que funcione (principalmente):
El
-m
era necesaria para que el-w
efecto de la bandera de toma en una sola columna. La página de manual podría usar alguna reescritura para indicar eso.Al intentar una solución alternativa, descubrí que
pr
genera\t
caracteres, por lo que alimentar sus resultadoscut
dio como resultado el mismo problema.-1
(la bandera de la columna) dice específicamente en la página del manual:Sin embargo, sin esta opción, las
pr
líneas se truncan willy-nilly, a una longitud mucho más corta que la especificada.pr
también inserta un espacio antes (¿o después?) de cada palabra en un campo (es decir, cada lugar donde tengo un solo espacio, tiene dos después del procesamiento). Si hay demasiadas palabras, los espacios insertados ignoran la-w
restricción (creando un ajuste). Pero, curiosamente, las `` columnas '' que no están delimitadas por tabuladores (es decir, dispuestas en espacios en blanco) permanecen alineadas.fuente
Utilizando
awk
:Basado en la respuesta de Chris Down aquí .
fuente
Una utilidad que debería ser verdaderamente consciente del ancho de pantalla es
fold
: desafortunadamente, no parece tener una opción para descartar en lugar de envolver. Aunque probablemente sea terriblemente ineficiente, sin embargo, podría hacer algo comofuente