設定されたトランザクションのシーケンス番号を生成します。

設定されたトランザクションのシーケンス番号を生成します。

Record_typesが異なるファイルがあります。 (以下の例では、位置1-2; 1、、2など...はRecord_typesです。)1A2A3

ファイル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まで)は2番目のトランザクションであり、次に発生する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

関連情報