I have a couple of lines and want to group the line into 5 and then implode it for MySQL IN ()
query.
I have made it out until this
awk
pr
is the tool for this
$ seq 6 | pr -5ats,
1,2,3,4,5
6
$ seq 18 | pr -5ats,
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
16,17,18
seq 16 |awk '{printf NR%5 ? (NR % 5 ==1 ? $0 : ","$0) : ","$0"\n";}'
#output:
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
16
You can do:
awk 'NR%5==0{print s","$0; s=""; next} {if (length(s)>0){ s=s","$0 } else s=$0} END {print s}'
Test it:
$ seq 1 6 | awk 'NR%5==0{print s","$0; s=""; next} {if (length(s)>0){ s=s","$0 } else s=$0} END {print s}'
1,2,3,4,5
6
$ seq 1 12 | awk 'NR%5==0{print s","$0; s=""; next} {if (length(s)>0){ s=s","$0 } else s=$0} END {print s}'
1,2,3,4,5
6,7,8,9,10
11,12
#!/usr/bin/awk -f
{
a[NR] = $0
}
END {
for (b in a) {
printf a[b] (b % 5 && b != NR ? "," : RS)
}
}
Or one liner:
awk '{a[NR]=$0} END {for (b in a) printf a[b] (b%5 && b!=NR ? "," : RS)}'
Although not a single process awk
command, you can even use paste
and sed
combination like this:
$ cat file
1
2
3
4
5
6
$ paste - - - - - -d , < file | sed 's/,\+$//'
1,2,3,4,5
6
$ seq 1 12 > file
$ cat file
1
2
3
4
5
6
7
8
9
10
11
12
$ paste - - - - - -d , < file | sed 's/,\+$//'
1,2,3,4,5
6,7,8,9,10
11,12