awk зеркальные (обратные) строки

Я хочу перевернуть строки (одно слово) файла.

cat dummy

Hugo
Dumas
Camus

Требуемый результат выглядит так:

Hugo oguH
Dumas samuD
Camus sumaC

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


person pogibas    schedule 26.01.2013    source источник


Ответы (4)


Нет необходимости в perl или awk, просто используйте paste и rev и обработайте замену (в противном случае просто используйте временный файл):

paste -d ' ' file <(rev file)

Полученные результаты:

Hugo oguH
Dumas samuD
Camus sumaC
person Steve    schedule 26.01.2013
comment
Могу ли я спросить, почему при использовании только rev он меняет все файлы (вверх ногами) и при использовании этого порядка команд остается неизменным? - person pogibas; 26.01.2013
comment
@Poe: rev будет переворачивать каждую строку файла по вертикальной оси. Не путайте это с tac (который меняет порядок строк в файле). В приведенной выше команде используется paste для соединения каждой строки исходного файла с его вертикально противоположным аналогом (т. Е. Выводом rev). paste просто объединяет два (или более) файла рядом. HTH. - person Steve; 26.01.2013
comment
Или: rev file | paste -d ' ' file - Нет необходимости в подстановке процесса или в файле tmp. - person William Pursell; 27.01.2013

#!/usr/bin/awk -f

{
    row = $0
    s = ""
    for (i = length(row); i > 0; --i)
        s = s substr(row, i, 1)
    print row " " s
}

Для каждой строки во входных данных перебирайте символы, беря подстроку длины 1 из каждой позиции, и объединяйте их, чтобы получилась обратная строка. Затем выведите строку, пробел и перевернутую строку.

На Python проще!

#!/usr/bin/env python

import sys

for line in sys.stdin:
    row = line.strip()
    print(row + ' ' + row[::-1])

Для каждой строки стандартного ввода удалите пробелы, чтобы избавиться от новой строки. Затем выведите строку, пробел и строку в обратном порядке. Это перевернуто с использованием «фрагмента» с началом и концом по умолчанию, но с шагом -1, чтобы фрагмент получал символы в обратном порядке.

person steveha    schedule 26.01.2013

$ perl -pi -le '$_ .= $" . reverse' file.txt

Объяснение (подробнее см. perldoc perlrun):

  • -p: обработать и распечатать файл в построчном режиме
  • -i: разрешить редактирование на месте
  • -l: автоматически обрабатывать окончания строк (неявно chomps при использовании с -p и также добавляет $\
  • $": еще один способ указать ' ' в качестве значения по умолчанию - это пробел
  • $_ .= $" . reverse

    $_ соответствует строке, содержащейся в строке (минус конец строки chomp ed). Итак, здесь .= объединяется с $_ одним пробелом ($"), за которым следует строка reverse-d. Обратите внимание, что нет необходимости указывать reverse($_) явно, поскольку в скалярном контексте reverse() меняет значение $_, если не указаны аргументы.

person Zaid    schedule 26.01.2013

с одним лайнером sed

sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

person Mirage    schedule 26.01.2013