как добавить запятую между двумя символами в оболочке - PullRequest
1 голос
/ 19 июня 2020

У меня в качестве ввода строка с 1 заглавной буквой или строка с 2 заглавными буквами Здесь после Пример входной строки:

AB
AN
FG
K
M

Я хочу выполнить команду / функцию оболочки, которая переводит входную строку до 2 строчных букв, разделенных запятой "," (в случае ввода 2 заглавных букв) или 1 строчной буквы (в случае, если ввод - 1 заглавная буква),

выходы приведенных выше примеров

a,b
a,n
f,g
k
m

Я пробовал это

(echo -n "${s:0:1}" && [ "${s,1:1}" != "" ] && echo -n ",${s:1:1}") | tr [A-Z] [a-z]

Но я думаю, что есть простейшее решение с sed / awk

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

Не могли бы вы попробовать следующее.

awk '{$0=tolower($0);gsub(/[a-z]/,"&,");sub(/,$/,"")} 1' Input_file

Объяснение: Сначала преобразование всей строки в строчные буквы tolower, затем глобально замените каждую букву буквой и ,. Наконец, заменив последнее появившееся , на NULL, а затем указав 1, напечатав отредактированную строку.

2-е решение: Использование GNU sed:

sed 's/[[:alpha:]]/\L&,/g;s/,$//' Input_file
2 голосов
/ 19 июня 2020

Вы можете использовать этот awk:

awk 'BEGIN{FS=""; OFS=","} {$0 = tolower($0); $1=$1} 1' file

a,b
a,n
f,g
k
m

Подробности:

  • FS="": Используйте разделитель пустых полей, разделяющий каждый символ как отдельное поле
  • OFS=",": Использование разделителя выходных полей как ,
  • $0 = tolower($0): все символы верхнего регистра строчные
  • $1=$1 : Принудительно awk перезаписывать каждую запись с использованием OFS значения
  • 1: Распечатать каждую запись

Альтернативное решение:

Если ваш awk не поддерживает FS="" (пустой разделитель полей), используйте это решение:

awk -v OFS=, '{$0 = tolower($0); gsub(/[a-z]/, "&,"); sub(/,$/, "")} 1' file
1 голос
/ 19 июня 2020

, если ваш awk равен gawk ... awk -v FS='' '$0=tolower($0) {$1=$1}1' OFS=',' myFile

...