awk命令调整记录中的某些数据时保持相同的记录长度

awk命令调整记录中的某些数据时保持相同的记录长度

我有*.txt包含标题和预告片的文件。预告片包含许多特定记录。我正在执行一些文件操作,其中删除了某些记录,并且需要调整预告片记录计数。

我有执行此操作的命令,但是当数字从较大调整为较小或反之亦然时,此命令会更改记录长度。这是数据的示例。

HDRFILENAME   SOMETHING SOMETHING        
H ICOCOM   SOME DATA1                    
H ICOCOM   SOME DATA2                    
H ICOCOM   SOME DATA3                    
H ICOCOM   SOME DATA5                    
H ICOCOM   SOME DATA6                    
H ICOCOM   SOME DATA7                    
H ICOCOM   SOME DATA8                    
H ICOCOM   SOME DATA9                    
TLR11                                     

我需要调整预告片记录,输出如下所示:

1.......10........20........30........40..
HDRFILENAME   SOMETHING SOMETHING        
H ICOCOM   SOME DATA1                    
H ICOCOM   SOME DATA2                    
H ICOCOM   SOME DATA3                    
H ICOCOM   SOME DATA5                    
H ICOCOM   SOME DATA6                    
H ICOCOM   SOME DATA7                    
H ICOCOM   SOME DATA8                    
H ICOCOM   SOME DATA9                    
TLR9                                      

文件记录长度为 42 个字符,调整预告片计数后应保持不变。

我使用以下命令更改预告片记录计数:

{awk '/H ICOC/{cnt++} {sub(/TLR[0-9]+/,"TLR"(cnt+0))} 1' file}

有人可以帮助我如何保持/维持相同的记录长度吗?

在此输入图像描述

在此输入图像描述

$ cat -Ev test_mark.txt

HDRFILENAME   SOMETHING SOMETHING        ^M$
H ICOCOM   SOME DATA1                    ^M$
H ICOCOM   SOME DATA2                    ^M$
H ICOCOM   SOME DATA3                    ^M$
H ICOCOM   SOME DATA4                    ^M$
H ICOCOM   SOME DATA5                    ^M$
H ICOCOM   SOME DATA6                    ^M$
H ICOCOM   SOME DATA7                    ^M$
H ICOCOM   SOME DATA8                    ^M$
H ICOCOM   SOME DATA9                    ^M$
TLR11                                    ^M$
$

$ awk '/H ICOC/{cnt++} /^TLR/{$0=sprintf("%-*s", length(), "TLR"(cnt+0))} 1' test_mark.txt |猫-Ev

HDRFILENAME   SOMETHING SOMETHING        ^M$
H ICOCOM   SOME DATA1                    ^M$
H ICOCOM   SOME DATA2                    ^M$
H ICOCOM   SOME DATA3                    ^M$
H ICOCOM   SOME DATA4                    ^M$
H ICOCOM   SOME DATA5                    ^M$
H ICOCOM   SOME DATA6                    ^M$
H ICOCOM   SOME DATA7                    ^M$
H ICOCOM   SOME DATA8                    ^M$
H ICOCOM   SOME DATA9                    ^M$
TLR9                                      $

答案1

如果您只是希望输入的“TLR”行在处理后与之前的长度相同,那么那就是:

awk '/H ICOC/{cnt++} /^TLR/{$0=sprintf("%-*s", length(), "TLR"(cnt+0))} 1'

给出的最终解决方案我们现在知道您有 DOS 行结尾并希望保留它们:

awk -v ORS='\r\n' '{sub(/\r$/,"")} /H ICOC/{cnt++} /^TLR/{$0=sprintf("%-*s", length(), "TLR"(cnt+0))} 1' file

答案2

awk '/H ICOC/{cnt++} /^TLR/ {$0 = sprintf("TLR%-39d", cnt)} 1' file

相关内容