awk - タブで区切られた列の形式を動的に指定します。

awk - タブで区切られた列の形式を動的に指定します。

タブで区切られた動的長さ列(4つ)を含むファイルがあります(1つの列には空白がある可能性があります)。

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

バッシュでは、以下を使用してください。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

ファイルを2回処理します。まず、各列の最大幅を見つけて、ファイル形式を再指定します。出力から列を区切るためにタブを使用します。

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

関連情報