Ich habe eine Datei mit Spalten mit dynamischer Länge (vier), die durch Tabulatoren getrennt sind (eine Spalte kann Leerzeichen enthalten)
COL1 COL2 COL2 COL2 COL3 COL3 COL4
COL1 COL2 COL2 COL3 COL4 COL4
COL1 COL1 COL2 COL2 COL3 COL4 COL4 COL4
Ich möchte es dynamisch mit printf in awk formatieren? Ich kann es mit festen Anpassungen formatieren:
$ 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
Akzeptierte Antwort:
in bash, mit 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
verwendet 2 Leerzeichen, um die Spalten zu trennen
Mit awk würde ich schreiben
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
Wo ich die Datei zweimal verarbeite:zuerst, um die maximale Breite für jede Spalte zu finden, dann erneut, um die Datei neu zu formatieren. Ich verwende einen Tabulator, um die Spalten in der Ausgabe zu trennen.
col1 col2 col2 col2 col3 col3 col4
col1 col2 col2 col3 col4 col4
col1 col1 col2 col2 col3 col4 col4 col4