Команда
for i in `awk '{if(!seen[$2]++)print $2}' y.txt`;do awk -v i="$i" 'BEGIN {print "index i"i}$2==i {print $0}END {print "========================================"}' y.txt; done
выход
index i1
M1 1 1233
M2 1 3212
M3 1 55323
M4 1 4444233
M5 1 23444
M6 1 555333
M7 1 55567
========================================
index i2
M8 2 22224
M9 2 55566
M10 2 4567
========================================
index i3
M11 3 44242
M12 3 234234
========================================
index i4
M13 4 2233
M14 4 2442
M15 4 322352
M16 4 235242
M17 4 2324524
========================================
index i5
M18 5 232342
========================================
index i6
M19 6 2322523
M20 6 2332523
========================================
Ниже приводитсяbash
-основанный на csplit
служебном подходе:
### user customization section
tmpdir=$(mktemp -d)
prefix='outfile'
bunch=5
pat='@<TRIPOS>MOLECULE'
## break up the input file on pattern
csplit./file \
--silent \
--elide-empty-files \
--prefix "$tmpdir/$prefix" \
--suffix-format='%d.tmp' \
"/$pat/+1" '{*}' \
;
## coalesce the split up files into bunches
i=0
while :; do
start=$(( bunch * i ))
stop=$(( start + bunch - 1 ))
for ((j=start; j<=stop; j++)) {
printf '%s\n' "$tmpdir/$prefix$j.tmp"
} | xargs cat > "./$prefix.$i" 2>/dev/null || break
(( i++ ))
done
Текущий каталог будет содержать исходящие файлы. *гроздья.