Поменяйте слова, но соблюдайте порядок Bash - PullRequest
0 голосов
/ 22 мая 2018

У меня есть файл со строками.Я хочу изменить слова, но держать их в том же порядке.Например: «Проверить это слово» Результат: «tseT siht drow»

Я использую MAC, поэтому awk не работает.Что я получил сейчас

input=FILE_PATH
while IFS= read -r line || [[ -n $line ]]
do
    echo $line | rev
done < "$input"

Ответы [ 5 ]

0 голосов
/ 22 мая 2018

Если xargs работает на Mac:

echo "Test this word"  | xargs -n 1 | rev | xargs
0 голосов
/ 22 мая 2018

Вы на самом деле в довольно хорошей форме с Bash.Вы можете использовать циклы string-indexs и string-length и C-style for для циклического перебора символов в каждом слове, создавая обратную строку для вывода.Вы можете управлять форматированием несколькими способами, чтобы обрабатывать пробелы между словами, но простой флаг first=1 такой же простой, как и все остальное.С помощью чтения вы можете сделать следующее:

#!/bin/bash

while read -r line || [[ -n $line ]]; do        ## read line
    first=1                                     ## flag to control space
    a=( $( echo $line ) )                       ## put line in array
    for i in "${a[@]}"; do                      ## for each word
        tmp=                                    ## clear temp
        len=${#i}                               ## get length
        for ((j = 0; j < len; j++)); do         ## loop length times
            tmp="${tmp}${i:$((len-j-1)):1}"     ## add char len - j to tmp
        done
        if [ "$first" -eq '1' ]; then           ## if first word
            printf "$tmp"; first=0;             ## output w/o space
        else
            printf " $tmp"                      ## output w/space
        fi
    done
    echo ""     ## output newline
done

Пример ввода

$ cat dat/lines2rev.txt
my dog has fleas
the cat has none

Пример использования / Вывод

$ bash revlines.sh <dat/lines2rev.txt
ym god sah saelf
eht tac sah enon

Посмотрите вещи и дайте мне знать, если у вас есть вопросы.

0 голосов
/ 22 мая 2018

Внутри цикла чтения вы можете просто перебрать слова вашей строки и передать их в rev

line="Test this word"
for word in "$line"; do
    echo -n " $word" | rev
done
echo  # Add final newline

output

tseT siht drow
0 голосов
/ 22 мая 2018

Вот решение, которое полностью исключает awk

#!/bin/bash

input=./data
while read -r line ; do
    for word in  $line ; do
        output=`echo $word | rev`
        printf "%s " $output
    done
    printf "\n"
done < "$input"
0 голосов
/ 22 мая 2018

Использование rev и awk

Рассмотрим это как пример входного файла:

$ cat file
Test this word
Keep the order

Попробуйте:

$ rev <file | awk '{for (i=NF; i>=2; i--) printf "%s%s",$i,OFS; print $1}'
tseT siht drow
peeK eht redro

(Используется awk, но, поскольку он используетнет расширенных функций awk, он должен работать на MacOS.)

Использование в скрипте

Если вам нужно поместить вышеупомянутое в скрипт, то создайте файл наподобие:

$ cat script
#!/bin/bash
input="/Users/Anastasiia/Desktop/Tasks/test.txt"
rev <"$input" | awk '{for (i=NF; i>=2; i--) printf "%s%s",$i,OFS; print $1}'

И, запустите файл:

$ bash script
tseT siht drow
peeK eht redro

Использование bash

while read -a arr
do
   x=" "
   for ((i=0; i<${#arr}; i++))
   do
      ((i == ${#arr}-1)) && x=$'\n'
      printf "%s%s" $(rev <<<"${arr[i]}") "$x"
   done
done <file

Применение выше к нашему тестовому файлу:

$ while read -a arr; do x=" "; for ((i=0; i<${#arr}; i++)); do ((i == ${#arr}-1)) && x=$'\n'; printf "%s%s" $(rev <<<"${arr[i]}") "$x"; done; done <file
tseT siht drow 
peeK eht redro 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...