Formatta stdout come testo a più colonne


3

Sto cercando di prendere alcuni dati a colonna singola e visualizzarli in una tty come colonne, proprio come lsfa. Fondamentalmente, puoi pensare a questo come provare a prendere l'output da ls -1e farlo apparire come l'output normale di ls, in cui il numero di colonne e lo spazio assegnato a ciascuna colonna è ottimizzato.

Il comando colonna non può essere facilmente costretto a prendere una certa larghezza e l' prutilità non cambia dinamicamente il numero di colonne.

Con tutti i comandi di analisi del testo disponibili, non riesco proprio a credere che non ci sia un modo per far sì che ciò avvenga fuori dalla scatola.

Questo sarebbe uno script di shell piuttosto complesso, perché per calcolare la larghezza ottimale della colonna devi sapere quanti elementi ci saranno nella tua colonna (per calcolare la lunghezza dell'elemento più lungo), che non conosci fino a quando non capire quante colonne ci saranno, che dipende dalla larghezza di ciascuna colonna. A causa del ragionamento circolare, sembra che la raffinatezza iterativa sia l'unica strada da percorrere. Non è difficile, ma neanche una linea. Un built-in sarebbe una soluzione molto migliore se esiste.


Awk è comunemente usato per questo.
technosaurus

1
Come hai detto, la larghezza della colonna non può essere conosciuta prima che tutte le linee debbano essere esaminate. La maggior parte dei filtri semplici funziona come pipe (tranne ordinamento che utilizza il file tmp). Questo non lo rende così banale e, a seconda del caso, potrebbe essere più semplice scrivere questo script in base a ciò di cui hai esattamente bisogno.
Cougar,

Risposte:


1

Ti consigliamo il prcomando:

$ seq 25 | pr -t -5
1         6         11        16        21
2         7         12        17        22
3         8         13        18        23
4         9         14        19        24
5         10        15        20        25

0

Potresti essere contento

My Command | column -t 

Vedi Modo semplice per rendere colonne STDOUT (formattare il testo in colonne)?

Se si desidera disporre più righe in una, è possibile utilizzare il comando sed in quanto tale

ls -1 \
| sed -e 'N;N;N;s/\n/\t/g' \
| column -t 

In questo caso, stai creando una riga da quattro (tre N;è quattro meno una), quindi stai cambiando nuova riga \nin tab ( \t) per ogni nuova riga ( \t) nel buffer ( g).

L'ultima riga lo column -ttrasforma in colonne ottimali.

Il finale \sfugge semplicemente ai nuovi caratteri di linea. Potresti voler scrivere

ls -1 | sed -e 'N;N;N;s/\n/\t/g' | column -t 

anziché.

Spero ti stia divertendo.


Sto cercando di gestire i dati a colonna singola che voglio inserire in più colonne. columnè utile solo per organizzare i dati multi-colonna. vale a dire: ls -1 | column -tnon riorganizza le cose per assomigliarels
Doug J,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.