15 個の列と多数の行を持つ次の形式のソースファイルがあります。
23.5 31.5 5.00 255 0 255 2 1 sal unknown sa time sps meter ms
25.5 32.5 6.00 0 255 0 2 2 sal unknown sa time sps meter ms
次のawkコマンドを使用して目的の形式に変換しました。
awk '{printf " %-12s %-13s %-8s%3s %3s %3s %2s %-2s %-47s %-20s %-5s %-11s %-39s %-19s %-6s \n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15 }' source.fault_data > target_fmt.dat
15列間を変換または埋める短いコマンドはありますか?
必須形式:
Col. No. Col. should be between these positions
1 1 12
2 13 24
3 25 36
4 37 39
5 41 43
6 45 47
7 49 50
8 51 52
9 53 102
10 103 122
11 123 127
12 128 139
13 140 179
14 180 199
15 200 205
答え1
まあ、あなたが望むものは次のとおりです。
- 各列を説明する3行(番号、開始位置、終了位置)を含むファイルがあります。
- 次に、その形式を使用して他のファイルの内容を表示します。
これは最初の試みです。私は次のことを前提としています。
- 示されているように、
formattingfile
次のように明確に定義されています。- 列数が増え、
- 大佐は順番に説明されておらず、何も残っていませんでした。
- 最初の「タイトル」行があります)
- そして
filetodisplay
ヘッダーラインはありません。
これはこれを試みるawkプログラムです:
awk ' BEGIN {lastendcol=0;}
( NR == FNR) && ( FNR == 1 ) { next ;}
( NR == FNR) { formatstring=formatstring "%-"($3-lastendcol)"s" ;
lastendcol=$3;
next ;}
{ printf formatstring"\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15 ;}
' formattingfile filetodisplay
最初のパス(NR = = FNR)は、最初の行(ヘッダー)を無視し、「formattingfile」を読み取り、「formatstring」書式変数を作成します。
2番目のステップ(NR> FNR)では、「formatstring \ n」を使用して「filetodisplay」の各行を表示します。
もちろん、ここにある2つのファイルは次のようになります。
「表示するファイル」ファイル:
23.5 31.5 5.00 255 0 255 2 1 sal unknown sa time sps meter ms
25.5 32.5 6.00 0 255 0 2 2 sal unknown sa time sps meter ms
etc ....
ファイル「フォーマットファイル」:
Col. No. Col. should be between these positions
1 1 12
2 13 24
3 25 36
4 37 39
5 41 43
6 45 47
7 49 50
8 51 52
9 53 102
10 103 122
11 123 127
12 128 139
13 140 179
14 180 199
15 200 205