Mám soubor se sloupci dynamické délky (čtyři) oddělenými tabulátory (sloupec může mít mezery)
COL1 COL2 COL2 COL2 COL3 COL3 COL4
COL1 COL2 COL2 COL3 COL4 COL4
COL1 COL1 COL2 COL2 COL3 COL4 COL4 COL4
Chtěl bych to dynamicky formátovat pomocí printf v awk? Mohu jej naformátovat s pevnými úpravami:
$ awk 'BEGIN {FS="t"}; {printf "%-10s %-10s %-15s %-15sn", $1,$3,$4,$2}' test
COL1 COL3 COL3 COL4 COL2 COL2 COL2
COL1 COL3 COL4 COL4 COL2 COL2
COL1 COL1 COL3 COL4 COL4 COL4 COL2 COL2
Přijatá odpověď:
v bash pomocí column
$ column -s $'t' -t file.tsv
col1 col2 col2 col2 col3 col3 col4
col1 col2 col2 col3 col4 col4
col1 col1 col2 col2 col3 col4 col4 col4
column -t
používá k oddělení sloupců 2 mezery
S awk bych napsal
awk -F 't' -v cols=4 '
NR == FNR {
for (i=1; i<=cols; i++)
if (NR == 1 || length($i) > w[i])
w[i] = length($i)
next
}
{
for (i=1; i<=cols; i++)
printf "%-*s%s", w[i], $i, (i == cols ? ORS : FS)
}
' file.tsv file.tsv
Kde soubor zpracovávám dvakrát:nejprve k nalezení maximální šířky pro každý sloupec, pak znovu k přeformátování souboru. K oddělení sloupců ve výstupu používám tabulátor.
col1 col2 col2 col2 col3 col3 col4
col1 col2 col2 col3 col4 col4
col1 col1 col2 col2 col3 col4 col4 col4