GNU/Linux >> Linux Esercitazione >  >> Linux

Lum – Awk – Formattazione dinamica di colonne separate da tabulazioni?

Ho un file con colonne di lunghezza dinamica (quattro) separate da tabulazioni (una colonna può avere spazi)

COL1    COL2 COL2 COL2  COL3 COL3       COL4
COL1    COL2 COL2       COL3    COL4 COL4
COL1 COL1       COL2 COL2       COL3    COL4 COL4 COL4

Vorrei formattarlo dinamicamente con printf in awk? Posso formattarlo con regolazioni fisse:

$ 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

Risposta accettata:

in bash, usando 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 utilizza 2 spazi per separare le colonne

Con awk, scriverei

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

Dove sto elaborando il file due volte:prima per trovare le larghezze massime per ciascuna colonna, poi di nuovo per riformattare il file. Uso una scheda per separare le colonne nell'output.

col1            col2 col2 col2  col3 col3       col4
col1            col2 col2       col3            col4 col4
col1 col1       col2 col2       col3            col4 col4 col4

Linux
  1. Usa awk per calcolare la frequenza delle lettere

  2. Una guida pratica per imparare awk

  3. Variabile esterna in Awk?

  4. Lum:unire colonne da due file separati?

  5. Rimuovere la ridondanza dalle colonne di output?

Comando AWK in Linux con esempi

Comando Awk in Linux

Comando AWK in Linux/Unix

Esempi di comandi pinky in Linux

Utilizzo di awk per stampare tutte le colonne dall'ennesima all'ultima

Come tagliare le prime n e le ultime n colonne?