我有一个具有不同 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 到下一次出现记录类型 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