2016-09-14 4 views
-1

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

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 
+0

Это код C? Должно ли это быть написано с помощью 'awk'? –

+0

предпочтительно написан в скрипте. Просто, что очистка исходных данных была выполнена в awk, поэтому я подумал, что было бы неплохо продолжить работу с awk. –

+0

«Сценарий» слишком общий. Какой язык программирования? –

ответ

0

Вот Python ответ.

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

  • Загрузить все буквы в списке
  • При п = 2..5, где п размер "окна". Вы «сдвигаете» это окно над списком и печатаете эти 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') 
0

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.

0

Другой в 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) 
     } 
} 
Смежные вопросы