2016-05-31 2 views
4

Я пытаюсь перевернуть содержимое любого предложения по вертикали. Таким образом, каждый символ любой строки будет печататься вертикально в одной строке. Например:Перевернуть несколько строк по вертикали на bash

Sample Text: This is an Example 

Output expected: T i a E 
       h s n x 
       i  a 
       s  m 
         p 
         l 
         e 

В следующем направлении я пытаюсь достичь этого, но пока не могу.

echo "Input provided by user is [email protected]" 
    for i in $(seq 1 $#); do 

     echo ${!i} | sed 's/./ &/g' | xargs |tr ' ' '\n' 

     done 


Current output: 

T 
h 
i 
s 
i 
s 
a 
n 
E 
x 
a 
m 
p 
l 
e 

Кроме того, это также не помогает

echo Print text vertically | fold -c -w1 
T 
h 
i 
s 

i 
s 

a 
n 

E 
x 
a 
m 
p 
l 
e 

Больше альтернативы, которые не работали:

#echo "Input provided by user is [email protected]" 

for i in $(seq 1 $#); do 

content[i]=$(echo ${!i}|fold -c -w1) 

    #echo ${content[i]} 


    done 

    echo ${content[@]} 

ответ

3

max переменная содержит максимальную длину среди всех слов. Для вашего текста было бы: length('Example') что 7 (максимальная из длин всех слов)

Использование файла awk сценария:

$ awk -f script.awk <<< "This is an Example" 
TiaE 
hsnx 
i a 
s m 
    p 
    l 
    e 

А вот сценарий:

{ 
     max=0 
     for(i=1;i<=NF;i++) 
       max=length($i)>max?length($i):max; 

     for(j=1;j<=max;j++) 
     { 
       for(i=1;i<=NF;i++) 
       { 
         temp=substr($i, j, 1); 
         printf temp==""?" ":temp 
       } 
       printf "\n" 
     } 
} 
+0

Сравнение, кроме '~' и '! ~ ', недействительны в простых операторах печати (оператор печати без круглых скобок) в стандартном грамматике 'awk'. [См. Стандарт под 'non_unary_print_expr'] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_16) – kdhp

2
#!/bin/bash 
function abc(){ 
maxIteration=0; 
for i in $(seq 1 $#); do 
j=$(echo ${!i}) 
if [ $maxIteration -lt ${#j} ] 
then 
maxIteration=${#j}; 
fi 
done 
COUNTER=0; 
while [ $COUNTER -lt $maxIteration ]; do 
      for i in $(seq 1 $#); do 
       j=$(echo ${!i}) 
       if [ ${#j} -gt $COUNTER ] 
       then 
         echo ${j:$COUNTER:1} | tr '\n' ' '; 
       else 
         echo " " | tr '\n' ' '; 
       fi 
      done 
echo -e "\n" 

       let COUNTER=COUNTER+1 
     done 
} 

abc [email protected]| grep . 
1

Я уже создал подобный сценарий. Короткие, но полные ДОУ:

#!/bin/bash 
count=0 
max=0 
#first determine the longest string so we can later pad shorter strings with spaces 
for i in $(echo "$1" | xargs -d: -i echo {}) 
do 
    size=$(echo $i | wc -c) 
    if [[ $size > $max ]] 
    then 
    max=$size 
    fi 
done 

files="" 
#then echo the strings vertically inside the tmp files 
for i in $(echo "$1" | xargs -d: -i echo {}) 
do 
    res=$(echo $i | sed 's/./ &/g' | xargs |tr ' ' '\n' > /tmp/$count.out) 
    #and add spaces at the end 
    add_space=$((max-$(echo $i | wc -c))) 
    for space in $(seq 0 $add_space) 
    do     
    echo " " >> /tmp/$count.out 
    done 
    files=$files" $count.out" 
    count=$((count+1)) 
done 
#and finally print them side by side 
pr -t -J -m -w 70 -S" " $files 

создать временные файлы в каталоге/TMP, эхо строки по вертикали, а затем использовать pr распечатать его.

% ./s.sh "This is an Example" 
T i a E 
h s n x 
i  a 
s  m 
     p 
     l 
     e 
+1

Используйте безопасное средство для временных файлов. Хотя возможность взломать ваш скрипт может показаться неважным, его можно использовать как вектор атаки против двоичных файлов системы. См. команда 'mktemp' на Debian; его справочная страница указывает на некоторые недостатки в предыдущих реализациях. – tripleee

+0

Спасибо за этот комментарий !! Я буду проверять, что мои новые скрипты используют «mktemp». – cb0

1

Поскольку Perl весело:

perl -a script.pl <<< 'This is an Example' 
T i a E 
h s n x 
i  a 
s  m 
     p 
     l 
     e 

И сценарий:

@F = map { [/./g] } @F; 
while (grep @{$_}, @F) { 
    printf "%s ", shift @{$_} || ' ' for @F; 
    print "\n" 
} 

Альтернативный сценарий: операции

perl -pe '$r.=$/while/\S/&&s/(\S)(\S*)|\B/$r.=($1||$").$";$2/ge}{$_=$r' \ 
    <<< 'This is an Example' 
T i a E 
h s n x 
i  a 
s  m 
     p 
     l 
     e 
Смежные вопросы