Record_types이 다른 파일이 있습니다. (아래 예에서 위치 1-2; 1
, 2
, 1A
등 2A
... 3
은 Record_types입니다.)
파일 1:
1 xxxx uuuu dfffgg cvbd
2 jjj oo dhjkkk ooo
2 9555 schghf kllls
1A chkds tddc ihg
2A hkkseadc
1 fdsff kljjgt uoohgf
1A ghyytd gkddgg tusab sg;dadug tdskd
1A gdjhjkh hdw ouiy axv kaksh ;ljqskl
3 gdhd tfyw ;lk;k; joo
1 gdhsgdhj uyutyu ljkgjg
2 hjkhclkshclk jhshcklj dhkjdh
2A hjkdhfsh jj okop oipo
거래를 설정하기 위해 일련번호를 생성하고 싶습니다. 예를 들어, Record_type 1에서 다음으로 발생하는 Record_type 1로 이동하는 것은 1개의 트랜잭션으로 간주됩니다.
위 파일에서 예를 들어, 1에서 2A까지(라인 5는 1개의 트랜잭션 파일이어야 함) 다음 1에서 3까지(라인 6에서 9까지)는 두 번째 트랜잭션이고, 다음으로 발생하는 1에서 2A는 트랜잭션의 1그룹입니다. .
이에 따라 이 분할을 수행하고 싶습니다. 다음 코드를 사용하여 시퀀스를 생성하고 사용합니다.
awk ' BEGIN {SEQ=0 } {if ( substr($0,1,2) == "1 " ) {SEQ++;} print $0SEQ }' file1 > file2
이제 내 파일 2는 다음과 같습니다. (일련번호는 줄의 마지막 숫자에 추가됩니다.)
1 xxxx uuuu dfffgg cvbd1
2 jjj oo dhjkkk ooo1
2 9555 schghf kllls1
1A chkds tddc ihg1
2A hkkseadc1
1 fdsff kljjgt uoohgf2
1A ghyytd gkddgg tusab sg;dadug tdskd2
1A gdjhjkh hdw ouiy axv kaksh ;ljqskl2
3 gdhd tfyw ;lk;k; joo2
1 gdhsgdhj uyutyu ljkgjg3
2 hjkhclkshclk jhshcklj dhkjdh3
2A hjkdhfsh jj okop oipo3
일련번호는 해당 줄의 마지막 숫자에 추가됩니다. 이로 인해 고정된 위치 길이로 값을 전달할 때 유효성 검사 문제가 발생합니다. 원하는 고정 위치나 줄 끝이 아닌 시작 부분에 시퀀스 번호를 추가하는 방법이 있습니까?
컬렉션 트랜잭션을 그룹화하는 더 좋은 방법이 있습니까?
awk ' BEGIN {SEQ=0 } {if ( substr($0,1,2) == "1 " ) {SEQ++;} print $0SEQ }' file1 > file2
답변1
awk ' BEGIN {SEQ=0 } {if ( substr($0,1,2) == "1 " ) {SEQ++;} printf "%10d%s\n",SEQ,$0 }' file1 > file2
답변2
첫 번째 필드에 1이 표시되면 시퀀스 번호를 늘리십시오. 그런 다음 첫 번째 필드에 다시 1이 표시될 때까지 해당 번호를 레코드 접두어로 계속 사용합니다. 헹구고 반복하십시오.
awk '
$1 == 1 {seq++}
{
print seq $0
}
' file
산출:
11 xxxx uuuu dfffgg cvbd
12 jjj oo dhjkkk ooo
12 9555 schghf kllls
11A chkds tddc ihg
12A hkkseadc
21 fdsff kljjgt uoohgf
21A ghyytd gkddgg tusab sg;dadug tdskd
21A gdjhjkh hdw ouiy axv kaksh ;ljqskl
23 gdhd tfyw ;lk;k; joo
31 gdhsgdhj uyutyu ljkgjg
32 hjkhclkshclk jhshcklj dhkjdh
32A hjkdhfsh jj okop oipo