내 입력 파일에는 다음과 같은 데이터가 포함되어 있습니다.
//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
...
//address: 902e008 data: 1 id: 799 len: 0 size: 2
//address: 9096004 data: 1 id: 800 len: 0 size: 2
//address: 9096008 data: 1 id: 801 len: 0 size: 2
//address: 9097004 data: 1 id: 802 len: 0 size: 2
...
//address: 902e008 data: 1 id: 1599 len: 0 size: 2
//address: 9096004 data: 1 id: 1600 len: 0 size: 2
//address: 9096008 data: 1 id: 1601 len: 0 size: 2
//address: 9097004 data: 1 id: 1602 len: 0 size: 2
위의 데이터에서 id
값이 800을 넘지 않아야 합니다. 순서는 1,2,...799,1,2...799와 같이 반복되어야 합니다.
그래서 내 출력은 다음과 같아야합니다
//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
...
//address: 902e008 data: 1 id: 799 len: 0 size: 2
//address: 9096004 data: 1 id: 1 len: 0 size: 2
//address: 9096008 data: 1 id: 2 len: 0 size: 2
//address: 9097004 data: 1 id: 3 len: 0 size: 2
...
//address: 902e008 data: 1 id: 799 len: 0 size: 2
//address: 9096004 data: 1 id: 1 len: 0 size: 2
//address: 9096008 data: 1 id: 2 len: 0 size: 2
//address: 9097004 data: 1 id: 3 len: 0 size: 2
누구든지 awk 명령에서 위 명령을 얻도록 도와줄 수 있습니까?
답변1
800에 도달했을 때 1로 롤백하려면 열을 다음과 같이 다시 계산해야 합니다. ((id - 1) % 799) + 1
여기서 %
는 모듈로 연산자입니다.
$ awk '/^\/\// { $6 = (($6 - 1) % 799) + 1; print }' file
//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
//address: 902e008 data: 1 id: 799 len: 0 size: 2
//address: 9096004 data: 1 id: 1 len: 0 size: 2
//address: 9096008 data: 1 id: 2 len: 0 size: 2
//address: 9097004 data: 1 id: 3 len: 0 size: 2
//address: 902e008 data: 1 id: 1 len: 0 size: 2
//address: 9096004 data: 1 id: 2 len: 0 size: 2
//address: 9096008 data: 1 id: 3 len: 0 size: 2
//address: 9097004 data: 1 id: 4 len: 0 size: 2
예상 출력에서 id
주소 902e008
는 799입니다. 범위를 [1, 799]로 제한하면 불가능합니다.
답변2
이것은 나에게 효과적입니다
awk 'BEGIN{FS=OFS=" "}{i++;if (i<5) {$6=i} else {i=0};print}' aa.txt
i<5를 i<800으로 변경하세요.
시험:
$ cat aa.txt
//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
//address: 9050004 data: 1 id: 4 len: 0 size: 2
//address: 9050008 data: 1 id: 5 len: 0 size: 2
//address: 902e004 data: 1 id: 6 len: 0 size: 2
$ awk 'BEGIN{FS=OFS=" "}{i++;if (i<5) {$6=i} else {i=0};print}' aa.txt
//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
//address: 9050004 data: 1 id: 4 len: 0 size: 2
//address: 9050004 data: 1 id: 5 len: 0 size: 2
//address: 902e004 data: 1 id: 1 len: 0 size: 2
답변3
@Kusalananda의 Perl 변형:
perl -pE 's/id: *\K(\d+)/($1-1)%799+1/e'
(숫자는 PO 예시와 정확히 일치하지 않습니다.)