Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Mike Lewis on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

split row by group of ten in each row splited

Status
Not open for further replies.

seifou45

Technical User
May 2, 2022
9
DZ
hi all:

I have a thousand of variable rows in texte file , I took an examlpe of one row :

Code:
ADD=ARGX,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX&100-262-PAX&
100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX100-28-PAX;

I have used this piece of awk code to parse the text file but I didn't get what I want :

Code:
awk -F'[,]'  -v RS='[&\n]' 'NF>1{k=$1} {gsub(/;/, "", $NF);print k,",PUT,Uid=",$NF,";"}'

I want to get this :

Code:
ADD=ARGX,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;    
ADD=ARGX,FID,Uid=100-262-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX&100-28-PAX;

thanks for your help and support
 
and what is the rule which are you using to split the row
 
hi again:

I want to split my line after (10th of &).

my awk code create 20 lines , I want only two which conatin 10 of & and so on .

Code:
awk -F'[,]'  -v RS='[&\n]' 'NF>1{k=$1} {gsub(/.{10}/,"& ");gsub(/;/, "", $NF);print k,",PUT,Uid=",$NF,";"}'  tek

I have an extra Uid= in first line after split i don't want it .

Code:
ADD=ARGX ,PUT,Uid= Uid=100-31-PAX ;
ADD=ARGX ,PUT,Uid= 100-41-PAX ;
ADD=ARGX ,PUT,Uid= 100-57-PAX ;
ADD=ARGX ,PUT,Uid= 100-65-PAX ;
ADD=ARGX ,PUT,Uid= 100-77-PAX ;
ADD=ARGX ,PUT,Uid= 100-119-PAX ;
ADD=ARGX ,PUT,Uid= 100-175-PAX ;
ADD=ARGX ,PUT,Uid= 100-194-PAX ;
ADD=ARGX ,PUT,Uid= 100-225-PAX ;
ADD=ARGX ,PUT,Uid= 100-257-PAX ;
ADD=ARGX ,PUT,Uid= 100-262-PAX ;
ADD=ARGX ,PUT,Uid= 100-271-PAX ;
ADD=ARGX ,PUT,Uid= 100-287-PAX ;
ADD=ARGX ,PUT,Uid= 100-289-PAX ;
ADD=ARGX ,PUT,Uid= 100-345-PAX ;
ADD=ARGX ,PUT,Uid= 100-361-PAX ;
ADD=ARGX ,PUT,Uid= 100-415-PAX ;
ADD=ARGX ,PUT,Uid= 100-436-PAX ;
ADD=ARGX ,PUT,Uid= 100-447-PAX ;

this what I want :

Code:
ADD=ARGX,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;    
ADD=ARGX,FID,Uid=100-262-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX&100-28-PAX;

 
seifou45 said:
I want only two which contain 10 of & and so on
.. but I don't see in your code that you test the 10 & on any place
 
I took Record Separator ";" and Field Separator "&" and got this result:
Code:
$ awk -f seifou45_01.awk seifou45_01.txt
ADD=ARGX,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;
ADD=ARGX,FID,Uid=100-262-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX100-28-PAX;
It seems to be what you want
 
Hi mikrom:

I have changed awk code as your recomandation but I got only two lines :

Code:
awk -F'[&]'  -v RS='[;\n]' 'NF>1{k=$1} {gsub(/;/, "", $NF);print k,",PUT,Uid=",$NF,";"}'  tek.txt

result after execution :

Code:
ADD=ARGX,FID,Uid=100-31-PAX ,PUT,Uid= 100-447-PAX ;
ADD=ARGX,FID,Uid=100-31-PAX ,PUT,Uid=  ;

I 'm sorry to ask you this can you post your awk code ?
thanks
 
Of course, I was in a big hurry before and forgot to post my source code. Here it is:

seifou45_01.awk
Code:
# run:
# awk -f seifou45_01.awk seifou45_01.txt

BEGIN {
 RS = ";"
 FS = "&" 
}

{
  # chomp 
  sub(/\r+/, "", $0)
  sub(/\n+/, "", $0)
  sub(/\s+/, "", $0)
}

$0 == "" {
  # skip empty lines
  next
}

{ 
  # 1.line
  # print $1 .. $9
  for (i=1; i < 10; i++) {
    printf("%s&", $i)
  }
  # print $10
  printf("%s;\n", $10)

  # 2.line
  printf("%s", "ADD=ARGX,FID,Uid=")
  # print $11 .. $NF-1 
  for (i=11; i < NF; i++) {
    printf("%s&", $i)
  }
  # print $NF
  printf("%s;\n", $NF)
}

Try it!
 
I tried the program on this data file with 2 very long lines:

seifou45_01.txt
Code:
ADD=ARGX,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX&100-262-PAX&
100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX100-28-PAX;
ADD=ARGX,FID,Uid=110-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX&100-272-PAX&
100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX100-28-PAX;

and the result of this command:
Code:
$ awk -f seifou45_01.awk seifou45_01.txt > seifou45_out.txt

produced this output file with 4 shorter lines:

seifou45_out.txt
Code:
ADD=ARGX,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;
ADD=ARGX,FID,Uid=100-262-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX100-28-PAX;
ADD=ARGX,FID,Uid=110-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;
ADD=ARGX,FID,Uid=100-272-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX100-28-PAX;

 
Hi mikrom:

Sorry for my delay I'll test it and Get back To you.

Thanks a lot of.
 
hi mikrom:

it works fine but I did a big mistakes in my description of my texte file .

sorry I didn't pay attention .

have a look on the newest data .

Code:
ADD=ARGX,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX&100-262-PAX&100-271-PAX&100-287-PAX&
100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX;
ADD=VRRP,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX&100-262-PAX&100-271-PAX&100-287-PAX&
100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX;
ADD=CLMTP,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX&100-262-PAX&100-271-PAX&100-287-PAX&
100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX;

the first field change after ADD= and I need it in the second line .

I need bellow output:

Code:
ADD=ARGX,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;
ADD=ARGX,FID,Uid=100-262-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX;
ADD=VRRP,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;
ADD=VRRP,FID,Uid=100-262-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX;
ADD=CLMTP,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;
ADD=CLMTP,FID,Uid=100-262-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX;

sorry again and thanks a lot of
 
It's no problem to take the first part of $1, e.g.:
ADD=ARGX,FID,Uid=
ADD=VRRP,FID,Uid=
.. etc


 
Hi

The problem is located in second Line
They must follow the first one for All lines splitted after 10th .
 
Code:
# run:
# awk -f seifou45_01.awk seifou45_01.txt

BEGIN {
 RS = ";"
 FS = "&" 
}

{
  # chomp 
  sub(/\r+/, "", $0)
  sub(/\n+/, "", $0)
  sub(/\s+/, "", $0)
}

$0 == "" {
  # skip empty lines
  next
}

{
  split($1, my_array, "Uid=")
  first_part = my_array[1]"Uid="
  # 1.line
  # print $1 .. $9
  for (i=1; i < 10; i++) {
    printf("%s&", $i)
  }
  # print $10
  printf("%s;\n", $10)

  # 2.line
  printf("%s", first_part)
  # print $11 .. $NF-1 
  for (i=11; i < NF; i++) {
    printf("%s&", $i)
  }
  # print $NF
  printf("%s;\n", $NF)
}

Output:
Code:
$ awk -f seifou45_01.awk seifou45_01.txt
ADD=ARGX,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;
ADD=ARGX,FID,Uid=100-262-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX;
ADD=VRRP,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;
ADD=VRRP,FID,Uid=100-262-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX;
ADD=CLMTP,FID,Uid=100-31-PAX&100-41-PAX&100-57-PAX&100-65-PAX&100-77-PAX&100-119-PAX&100-175-PAX&100-194-PAX&100-225-PAX&100-257-PAX;
ADD=CLMTP,FID,Uid=100-262-PAX&100-271-PAX&100-287-PAX&100-289-PAX&100-345-PAX&100-361-PAX&100-415-PAX&100-436-PAX&100-447-PAX;
 
hi :

100000000000000000000 thanks .

it works fine
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top