2015-05-02 1 views
3

Мне нужно сделать скрипт для bash, чтобы решить игру слов по 8 направлениям. Мне удалось сделать какой-то код, но последнее, что я застрял, - это как повернуть таблицу, чтобы найти слова во всех направлениях. 90 ° не проблема, но 45 ° ... Я думаю, awk может помочь, но я не очень хорош в этом. Спасибо.ShellScript Поворот прямоугольного текста на 45 °

Пример:

 
abcd 
efgh 
ijkl 

=>

 
a 
eb 
ifc 
jgd 
    kh 
    l 

Пример 2:

 
abcde 
fghij 
klmno 

=>

 
a 
fb 
kgc 
lhd 
    mie 
    nj 
    o 

Пример 3:

 
abc 
defg 
hi 

=>

 
a 
db 
hec 
if 
    g 
+1

Пожалуйста, взгляните на [Как создать минимальное, полное и Verifiab пример] (http://stackoverflow.com/help/mcve). Покажите пример ввода и ваш желаемый результат для ввода этого образца. – Cyrus

+0

Пожалуйста, вы должны добавить примеры: 3words x 5letters, 3words x каждое слово с разной длиной, если это возможно ?, и т. Д. –

ответ

2
$ cat tst.awk 
BEGIN { FS="" } 
{ 
    for (i=1;i<=NF;i++) { 
     a[NR,i]=$i 
    } 
    numCols = (NF>numCols?NF:numCols) 
    numRows = NR 
} 
END { 
    rowNr=1 
    for (colNr=1;colNr<=numCols;colNr++) { 
     for (;rowNr<=numRows;rowNr++) { 
      printf "%*s", colNr-1, "" 
      for (delta=0;delta<rowNr;delta++) { 
       printf "%s%s", a[rowNr-delta,colNr+delta], (delta<(rowNr-1)?FS:RS) 
      } 
     } 
     rowNr=numRows 
    } 
} 

.

$ awk -f tst.awk file1 
a 
eb 
ifc 
jgd 
    kh 
    l 
$ 
$ awk -f tst.awk file2 
a 
fb 
kgc 
lhd 
    mie 
    nj 
    o 
$ 
$ awk -f tst.awk file3 
a 
db 
hec 
if 
    g 

Ответьте на комментарии ниже от @JoseRicardoBustosM. предполагая, что выше не дает желаемых результатов от одного из его образцов входов, вот предложил input4:

$ cat input4 
Jose 
y 
Ricardo 
y 
Gloriset 

и выше скрипт запустить на нем:

$ awk -f tst.awk input4 
J 
yo 
Rs 
yie 
Gc 
la 
    or 
    rd 
    io 
    s 
     e 
     t 

и вот модифицированный скрипт вводить пустые символы, если не существует IF, что было желательным поведением, которое, я думаю, крайне маловероятно:

$ cat tst2.awk 
BEGIN { FS="" } 
{ 
    for (i=1;i<=NF;i++) { 
     a[NR,i]=$i 
    } 
    numCols = (NF>numCols?NF:numCols) 
    numRows = NR 
} 
END { 
    rowNr=1 
    for (colNr=1;colNr<=numCols;colNr++) { 
     for (;rowNr<=numRows;rowNr++) { 
      printf "%*s", colNr-1, "" 
      for (delta=0;delta<rowNr;delta++) { 
       printf "%s%s", ((rowNr-delta,colNr+delta) in a ? a[rowNr-delta,colNr+delta] : " "), (delta<(rowNr-1)?FS:RS) 
      } 
     } 
     rowNr=numRows 
    } 
} 

$ awk -f tst2.awk input4 
J 
yo 
R s 
yi e 
G c 
l a 
    o r 
    r d 
    i o 
    s 
     e 
     t 
1

Я предложил бы использовать perl вместо awk. Perl очень мощный в обработке текстов, а синтаксис довольно C-like.

Насколько я понимаю, что «вращение текста на 45 °» означает, следующий скрипт выполняет такой поворот:

rotate_text_45.pl:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @input = <>; 
my $lines_count = scalar @input; 

my $global_max_diag = 0; 
for my $i (0 .. scalar @input - 1){ 
    chomp $input[$i]; 
    $input[$i] = [split //, $input[$i]]; 
    my $max_diag = $i + scalar(@{$input[$i]}) - 1; 
    $global_max_diag = $max_diag if $max_diag > $global_max_diag; 
} 

for my $diag (0 .. $global_max_diag){ 
    for my $i (0 .. $diag){ 
     next if $diag - $i >= $lines_count; 
     $input[$diag - $i][$i] = ' ' unless defined $input[$diag - $i][$i]; 
     print $input[$diag - $i][$i]; 
    } 
    print "\n"; 
} 

Предполагая, что входной файл выглядит следующим образом:

$ cat in.txt 
iftkn 
iarwp 
cooop 
froas 
blmaz 

сценарий производит этот результат:

$ ./rotate_text_45.pl in.txt 
i 
if 
cat 
fork 
brown 
loop 
map 
as 
z 

Для выполнения вращения на 135 ° или 225 ° я предлагаю вращение на 90 ° (180 °), а затем вращение на 45 °.

+0

Я бы предложил использовать 'awk' вместо' perl'. 'Awk' очень эффективен в обработке текстов, а синтаксис довольно похож на C. –

1
awk ' 
BEGIN{ 
    sum = 0; 
} 
{ 
    words[NR] = $0; 
    sum += length($0); 
} 
END{ 
    cant_words = length(words); 
    for(i=1; i<=cant_words; i++){ 
    flag[i] = 2-i; 
    } 
    cont_letter = 0; 
    row = 1; 
    while(cont_letter<sum){ 
    out = ""; 
    for(i=0; i<row-cant_words; i++){ 
     out = out" "; 
    } 
    cont_space = 0; 
    for(i=cant_words; i>=1; i--){ 
     if(flag[i] >= 1 && flag[i] <= length(words[i])){ 
     for(j=0; j<cont_space; j++){ 
      out=out" " 
     } 
     cont_space = 0; 
     out=out""substr(words[i],flag[i],1); 
     cont_letter = cont_letter + 1; 
     }else{ 
     if(flag[i] > length(words[i])){ 
      cont_space = cont_space + 1; 
     } 
     } 
     flag[i] = flag[i]+1; 
    } 
    print out; 
    row = row + 1; 
    } 
} 
' input 

вход1:

 
abcd 
efgh 
ijkl 

выход1:

 
a 
eb 
ifc 
jgd 
    kh 
    l 

вход2

 
abc 
defg 
hi 

выход2

 
a 
db 
hec 
if 
    g 

вход3

 
abc 
defg 
hi 
jklm 

output3

 
a 
db 
hec 
jif 
k g 
    l 
    m 

вход4

 
Jose 
y 
Ricardo 
y 
Gloriset 

output4

 
J 
yo 
R s 
yi e 
G c 
l a 
    o r 
    r d 
    i o 
    s 
     e 
     t 
Смежные вопросы