GNU/Linux >> Znalost Linux >  >> Linux

Lum – Awk – Dynamicky formátovat sloupce oddělené tabulátory?

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

Linux
  1. Průvodce pro začátečníky koukáním

  2. Externí proměnná v Awk?

  3. Lum – sloučení sloupců ze dvou samostatných souborů?

  1. Jak používat Awk k tisku pouze řádků obsahujících 5 sloupců?

  2. Odstranění redundance z výstupních sloupců?

  3. Formát souboru Core-dump

  1. Použijte awk k výpočtu frekvence písmen

  2. Praktický průvodce učením awk

  3. 4 Příklady prohlášení Awk If ( if, if else, if else if, :? )