Один из способов сделать это с помощью редактора sed:
sed -e '
s/,/\n/
s/\(\n.*[[:blank:]]\)\([^,]*\),/ \2\1/
P;D
' input.file
Рабочий:
Другой метод, использующий Perl,:
perl -lane '
my($kref, $vref, %h) = map { [split /,/] } @F[0,1];
@h{@$kref} = @$vref;
print "$_ $h{$_}" for @$kref;
' input.file
Здесь показан другой способ:
perl -lpe 'print "$1 $3" while s/^([^,]*),(.*\h)([^,]*),/$2/' input.file
Работа:
perl -lane '
my($kref, $vref) = map { [split /,/] } @F;
print shift @$kref, " ", shift @$vref while @$kref && @$vref;
' input.file
Работа:
Выход:
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
Используйте группу захвата (...)
для трехбуквенной комбинации, т. е. ([A-Z]{3})
и используйте \1
для ссылки на эту (первую группу )в замене.
Пример:
$ printf '%s\n' AGLU AASP ALYS AVAL | sed -E 's/A([A-Z]{3})/ \1/'
GLU
ASP
LYS
VAL
Да, sed
должно работать -, если я понимаю, что вы на самом деле хотите сделать. Вот пример строки (, которая может быть именем файла ), содержащим букву A
. Подстановки SED ниже заменят первое вхождение буквы A
строкой _
,``(нулевой -длины )и . соответственно.
$ SOMEFILE="AASP"
$ echo $SOMEFILE
AASP
$ echo $SOMEFILE | sed "s/A/_/"
_ASP
$ echo $SOMEFILE | sed "s/A//"
ASP
$ echo $SOMEFILE | sed "s/A/ /"
ASP