Record_typesが異なるファイルがあります。 (以下の例では、位置1-2; 1
、、2
など...はRecord_typesです。)1A
2A
3
ファイル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