извлекать символы из каждой строки в указанном порядке - PullRequest
1 голос
/ 28 марта 2020

Я хочу извлечь N-й символ с указанием c порядка, используя команду bash.

Например, если sample.txt содержит строки, подобные приведенным ниже ..

ABCDEFG
ABCDEFG
ABCDEFG
ABCDEFG

И мой желаемый результат ниже.

BDC
BDC
BDC
BDC

Но когда я использую cut -c 2,4,3 < sample.txt, я получаю,

BCD
BCD
BCD
BCD 

Как я могу сохранить заказ, который я даю? Есть ли другая команда или сценарий для этого действия?

Ответы [ 3 ]

3 голосов
/ 28 марта 2020

sed сделает это довольно просто, используя группы захвата и обратные ссылки со стандартной операцией s/find/replace/. Например:

sed 's/.\(.\)\(.\)\(.\).*$/\1\3\2/' file

Где sed использует \(stuff\) для захвата "stuff" с базовым синтаксисом c в части find, а затем использует номерную обратную ссылку \1 для заново вставьте то, что было захвачено в replace части выражения (\2 для 2-ой обратной ссылки для 2-й группы захвата и т. д.). '.' соответствует любому отдельному символу, а '*' - совпадение повторений для нуля или более вхождений. '$' является якорем для конца строки.

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

С вашими данными примера в file вы получите:

$ sed 's/.\(.\)\(.\)\(.\).*$/\1\3\2/' file
BDC
BDC
BDC
BDC

И sed, и другие awk решения будут на порядка быстрее, чем порождают отдельный процесс / подоболочку для cut каждой итерации.

2 голосов
/ 28 марта 2020

В некоторых популярных AWK *, когда разделитель полей является пустой строкой, каждый отдельный символ становится полем. Используя эту функциональность, вы можете легко извлечь выбранные символы в любом порядке. Например:

$ awk -v FS= '{print $2$4$3}' file
BDC
BDC
BDC
BDC

* Как GAWK, MAWK, busybox AWK, OpenBSD AWK и др. c.

1 голос
/ 28 марта 2020

С gawk или nawk:

awk -v FPAT='.' '{print $2$4$3}' file

Вывод:

BDC
BDC
BDC
BDC

С man gawk:

FPAT: регулярное выражение, описывающее содержимое полей в записи. Если установлено, gawk анализирует входные данные в поля, где поля соответствуют регулярному выражению, вместо использования значения переменной FS в качестве разделителя полей.

...