2014-10-11 40 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