我有*.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