2014-10-11 41 views
2

进出口寻找一种方式来从字母此块获得人对角线组合:shell脚本,用awk对角线词搜索

a b c d e f 
h i j k l m 
o p q r s t 
v w x y z a 
c d e f g h 
j k l m n o 

我有这样的:awk '{++f; print $(f + 0)}' file.txt

但只得到了我(如果我可以增加,1个F + 0,不知何故,6倍):

a i q y g o 
b j r z h 
c k s a 
d l t 
e m 
f 

,我需要另一半..这样的(不必是顺序如下:

a i q y g o 
h p x f n 
b j r z h 
o w e m 
c k s a 
v d l 
d l t 
c k 
e m 
j 
f 
+0

那么,什么是全所需的输出? – 2014-10-11 17:41:03

+1

更新了我的问题 – Brutalized 2014-10-11 18:05:33

回答

1
perl -lane' 
    push @r, [@F]; 
END { 
    for my $n (0 .. $#r) { 
    my (@x,@y); 
    for (0 .. $#r) { 
     push @x, $r[$n+$_][$_]; 
     push @y, $r[$_][$n+$_]; 
    } 
    print "@x"; 
    print "@y" if $n; 
    } 
} 
' file 

输出

a i q y g o 
h p x f n 
b j r z h 
o w e m 
c k s a 
v d l 
d l t 
c k 
e m 
j 
f 
+0

哇,这就是我需要的!大帮忙 – Brutalized 2014-10-11 20:55:47

+0

你maby知道一种方法来编辑你的代码,并从这个输出中得到可能的2,3,4,5,6个字母单词吗? – Brutalized 2014-10-12 12:44:24

2

您可以使用GNU datamash

$ datamash -t' ' transpose < file 
a h o v c j 
b i p w d k 
c j q x e l 
d k r y f m 
e l s z g n 
f m t a h o 
+0

tnx您的回复,但我得到:datamash:command not found – Brutalized 2014-10-11 17:57:45

+0

@Brutalized:您必须先安装它,请参阅http://www.gnu.org/software/datamash/download/ – cuonglm 2014-10-11 18:01:58

+0

我想避免 – Brutalized 2014-10-11 18:05:14

0

这是一个数组的工作。

#!/usr/bin/awk -f 

# Print diagonals from a square of text. 
# This script has no error checking. 
# Written by PM 2Ring 2014.10.13 

{ 
    for(i=1; i<=NF; i++) 
     a[NR,i] = $i 
} 

END{ 
    for(i=1; i<=NR; i++) 
    { 
     for(j=1; i+j-1<=NR; j++) 
      printf "%s ", a[i+j-1, j] 
     print "" 
     if (i == 1) 
      continue 
     for(j=1; i+j-1<=NR; j++) 
      printf "%s ", a[j, i+j-1] 
     print "" 
    } 
} 

下面是存储在阵列中的每个对角字上面的代码的一个版本。

#!/usr/bin/awk -f 

# Print diagonals from a square of text. 
# This script has no error checking. 
# Written by PM 2Ring 2014.10.13 

{ 
    for(i=1; i<=NF; i++) 
     a[NR,i] = $i 
} 

END{ 
    k = 1 
    for(i=1; i<=NR; i++) 
    { 
     word = "" 
     for(j=1; i+j-1<=NR; j++) 
      word = word a[i+j-1, j] 
     words[k++] = word 

     if (i == 1) 
      continue 

     word = "" 
     for(j=1; i+j-1<=NR; j++) 
      word = word a[j, i+j-1] 
     words[k++] = word 
    } 

    numwords = k 
    for (k=1; k<numwords; k++) 
     print words[k] 
} 

输出

aiqygo 
hpxfn 
bjrzh 
owem 
cksa 
vdl 
dlt 
ck 
em 
j 
f 

打印正交对角线,例如 'flrxdj',留给读者作为练习留给读者。

...

下面是打印在一个给定的单词的所有子词的功能。

#!/usr/bin/awk -f 

# Print subwords of a given word 
# Written by PM 2Ring 2014.10.13 

function print_subwords(s, i, j, len) 
{ 
    len = length(s) 
    for (i=1; i<=len; i++) 
    { 
     print "Length:", i 
     for (j=1; i+j-1 <= len; j++) 
      print substr(s, j, i) 
    } 
} 

BEGIN{ 
    print_subwords("ABCD") 
} 

输出

Length: 1 
A 
B 
C 
D 
Length: 2 
AB 
BC 
CD 
Length: 3 
ABC 
BCD 
Length: 4 
ABCD 
+0

你maby知道一种方法来编辑你的代码,并获得可能的2,3,4,5,6字母组合? – Brutalized 2014-10-12 15:07:21

+1

我确实这样做,但我认为你应该为自己努力。如果您遇到困难,请发布您的代码(最好在新问题中),我们会尽力提供帮助。但我会给你一些提示。 – 2014-10-13 05:57:26