Извлечение последовательного образца

Может кто-нибудь помочь мне о том, как написать скрипт для извлечения последовательных строк?
Мне удалось найти и получить скрипт, работающий для создания всех перестановок заданных входных данных, но это не то, что мне нужно.

awk 'function perm(p,s,     i) {
       for(i=1;i<=n;i++)
         if(p==1)
           printf "%s%s\n",s,A[i]
         else
           perm(p-1,s A[i]", ")
     }
     {
       A[++n]=$1
     }
     END{
       perm(n)
     }' infile

К сожалению, я недостаточно хорошо понимаю сценарий, чтобы внести изменения (не из-за отсутствия попыток).
Мне нужно извлечь от 2 до 5 последовательных шаблонов строк / слов.

Вот иллюстрация того, что мне нужно:

Например.

inputfile.txt:

A
B
C
D
E
F
G

OutputFile.txt:

A B
B C
C D
D E
E F
F G
A B C
B C D
C D E
D E F
E F G
A B C D
B C D E
C D E F
D E F G
A B C D E
B C D E F
C D E F G

3 ответа

awk в помощь!

$ awk 'BEGIN{n=1} 
      FNR==1{n++} 
            {a[c++]=$0; c=c%n} 
     FNR>n-1{for(i=c;i<c+n-1;i++) printf "%s ",a[i%n]; 
             print}' file{,,,}

1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8
7 8 9
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9

многократное сканирование входного файла (количество запятых). Используемый seq 9 в качестве входного файла.

Еще один в awk:

{ a[NR]=$0 }
END {
    o[0]=ORS
    for(i=2;i<=5;i++)
        for(j=1;j<=length(a);j++) {
            printf "%s%s", a[j], (++k==i?o[k=0]:OFS)
            if(!k&&j!=length(a)) j-=(i-1)
        }
}

Вот ответ Python.

Общий алгоритм:

  • Загрузить все буквы в список
  • Для n = 2..5, где n - размер "окна". Вы "скользите" этим окном по списку и печатаете эти n символов.

Python хорош для этого из-за нарезки списка.

with open('input.txt') as f_in, open('output.txt', 'w') as f_out:
    chars = f_in.read().splitlines() 

    for n in range(2, 6):
        for start_window in range(len(chars) - n + 1):
            f_out.write(' '.join(chars[start_window:start_window + n]))
            f_out.write('\n')
Другие вопросы по тегам