awk 或 sed 命令从所需位置或字节位置开始文件的每一列

awk 或 sed 命令从所需位置或字节位置开始文件的每一列

我有一个如下所示的源文件格式,包含 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

相关内容