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