GNU/Linux >> Linux の 問題 >  >> Linux

Lum – Awk –タブ区切りの列を動的にフォーマットしますか?

タブで区切られた動的な長さの列(4つ)を持つファイルがあります(列にはスペースを含めることができます)

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 %-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

承認された回答:

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

ここで、ファイルを2回処理します。最初に各列の最大幅を見つけ、次にファイルを再フォーマットします。タブを使用して、出力の列を区切ります。

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

Linux
  1. gawkの初心者向けガイド

  2. Lum – 2つの別々のファイルからの列のマージ?

  3. 出力列から冗長性を削除しますか?

  1. 4 Awk If ステートメントの例 ( if, if else, if else if, :? )

  2. awk を使用して n 番目から最後までのすべての列を出力する

  3. 最初のn列と最後のn列を切り取る方法は?

  1. Awkの外部変数?

  2. コアダンプ ファイル形式

  3. grep と awk の使用