我有一个文件,其中包含动态长度列(四个),用制表符分隔(一列可以有空格)
COL1 COL2 COL2 COL2 COL3 COL3 COL4
COL1 COL2 COL2 COL3 COL4 COL4
COL1 COL1 COL2 COL2 COL3 COL4 COL4 COL4
我想用 awk 中的 printf 动态格式化它?我可以通过固定调整来格式化它:
$ awk 'BEGIN {FS="\t"}; {printf "%-10s %-10s %-15s %-15s\n", $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
答案1
在 bash 中,使用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
使用 2 个空格来分隔列
使用 awk,我会写
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
我处理文件两次:首先找到每列的最大宽度,然后再次重新格式化文件。我使用制表符来分隔输出中的列。
col1 col2 col2 col2 col3 col3 col4
col1 col2 col2 col3 col4 col4
col1 col1 col2 col2 col3 col4 col4 col4