Я хочу перевернуть строки (одно слово) файла.
cat dummy
Hugo
Dumas
Camus
Требуемый результат выглядит так:
Hugo oguH
Dumas samuD
Camus sumaC
Вероятно, это проще всего сделать с помощью awk, но perl oneliner тоже будет отличным вариантом.
Я хочу перевернуть строки (одно слово) файла.
cat dummy
Hugo
Dumas
Camus
Требуемый результат выглядит так:
Hugo oguH
Dumas samuD
Camus sumaC
Вероятно, это проще всего сделать с помощью awk, но perl oneliner тоже будет отличным вариантом.
Нет необходимости в perl
или awk
, просто используйте paste
и rev
и обработайте замену (в противном случае просто используйте временный файл):
paste -d ' ' file <(rev file)
Полученные результаты:
Hugo oguH
Dumas samuD
Camus sumaC
rev
будет переворачивать каждую строку файла по вертикальной оси. Не путайте это с tac
(который меняет порядок строк в файле). В приведенной выше команде используется paste
для соединения каждой строки исходного файла с его вертикально противоположным аналогом (т. Е. Выводом rev
). paste
просто объединяет два (или более) файла рядом. HTH.
- person Steve; 26.01.2013
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, чтобы фрагмент получал символы в обратном порядке.
$ perl -pi -le '$_ .= $" . reverse' file.txt
Объяснение (подробнее см. perldoc perlrun
):
-p
: обработать и распечатать файл в построчном режиме-i
: разрешить редактирование на месте-l
: автоматически обрабатывать окончания строк (неявно chomp
s при использовании с -p
и также добавляет $\
$"
: еще один способ указать ' '
в качестве значения по умолчанию - это пробел$_ .= $" . reverse
$_
соответствует строке, содержащейся в строке (минус конец строки chomp
ed). Итак, здесь .=
объединяется с $_
одним пробелом ($"
), за которым следует строка reverse
-d. Обратите внимание, что нет необходимости указывать reverse($_)
явно, поскольку в скалярном контексте reverse()
меняет значение $_
, если не указаны аргументы.
с одним лайнером sed
sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'