GNU/Linux >> Belajar Linux >  >> Linux

Lum – Awk – Memformat Kolom Dipisahkan Tab secara Dinamis?

Saya memiliki file dengan kolom panjang dinamis (empat) dipisahkan dengan tab (kolom dapat memiliki spasi)

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

Saya ingin memformatnya secara dinamis dengan printf di awk? Saya dapat memformatnya dengan penyesuaian tetap:

$ 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

Jawaban yang Diterima:

di bash, menggunakan 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 menggunakan 2 spasi untuk memisahkan kolom

Dengan awk, saya akan menulis

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

Di mana saya memproses file dua kali:pertama untuk menemukan lebar maksimum untuk setiap kolom, kemudian memformat ulang file. Saya menggunakan tab untuk memisahkan kolom dalam output.

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

Linux
  1. Panduan pemula untuk melongo

  2. Lum – Menggabungkan Kolom Dari Dua File Terpisah?

  3. Bekerja Dengan Kolom – Awk Dan Sed?

  1. Gunakan awk untuk menghitung frekuensi huruf

  2. Menghapus Redundansi Dari Kolom Keluaran?

  3. 4 Contoh Pernyataan Awk If ( if, if else, if else if, :? )

  1. Panduan praktis untuk belajar awk

  2. Variabel Eksternal Dalam Awk?

  3. Bagaimana Cara Menggunakan Awk Untuk Mencetak Hanya Garis yang Berisi 5 Kolom?