提取顺序模式

时间:2016-09-14 06:30:26

标签: awk sequential

任何人都可以帮我写一个脚本来提取顺序线吗? 我能够找到并获得一个脚本来创建给定输入的所有排列,但这不是我需要的。

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 个答案:

答案 0 :(得分:0)

这是一个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')

答案 1 :(得分: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作为输入文件。

答案 2 :(得分: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)
        }
}