我有一个如下所示的源文件格式,包含 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
好吧,我相信你想要:
- 有 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”格式化变量。
第二遍(NR>FNR)将使用“formatstring\n”显示“filetodisplay”的每一行。
当然,这里的两个文件是:
文件“要显示的文件”:
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