Как разбить файл на несколько файлов после N появления шаблона?

Команда

  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
========================================
3
21.05.2021, 12:36
1 ответ

Ниже приводится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

Текущий каталог будет содержать исходящие файлы. *гроздья.

2
28.07.2021, 11:30

Теги

Похожие вопросы