*.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}
동일한 레코드 길이를 유지/유지하는 방법을 알려줄 수 있는 사람이 있나요?
$ 고양이 -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 |cat-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