Как говорит @Prvt _Yadv в своем ответе, это работает, потому что есть 13 точек.
Наборы
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
Точка не является специальным символом, поэтому, если у вас есть точка во вводе, она тоже будет переведена. В имеющейся у меня версии tr
это последний соответствующий символ во втором наборе, в данном случае этоM
:
$ echo URYC ZR CYRNFR. | tr.............A-Z A-ZA-Z
HELP ME PLEASEM
(Я мог предположить, что другая версия tr
могла бы использовать первый совпадающий символ в наборе 2, что дало бы A
.)
Чтобы ответить на ваш второй вопрос , вам нужно еще 13 точек в первом наборе, чтобы «израсходовать» оставшиеся прописные буквы во втором наборе:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ.............
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
затем вы можете повторить шаблон:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
, что дает нам:
tr.............A-Z..........................a-z A-ZA-Za-za-z
Итак,:
$ echo Uryc zr cyrnfr | tr.............A-Z..........................a-z A-ZA-Za-za-z
Help me please
Лично я думаю, что первый способ сделать это в вашем вопросе проще!
Первый способ также не преобразует никакие другие символы во входных данных. Например, сравните:
$ echo Uryc zr cyrnfr. | tr.............A-Z..........................a-z A-ZA-Za-za-z
Help me pleasem
с
$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.
Проблема в том, что у вас 8 или 9 полей данных в file1
и 5 или 6 в file2
. Либо C3 9999
это одно неправильно отформатированное поле или C410000
должно быть два поля C4
и 10000
.
Для настройки форматирования в зависимости от количества полей вы можете
n
при разделении строки и взятии последнего три значения a[n-2]
, a[n-1]
,a[n]
awk '
BEGIN{
fmt1="%8s %6s%5s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS
fmt2="%8s %11s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS
}
(getline line < "file 1") > -1{
n=split(line, a)
}
NF<=3{ print; next } # print original line
NF==6{ printf fmt1, $1, $2, $3, $4, $5, $6, a[n-2], a[n-1], a[n]; next } # 6 + 3 fields
{ printf fmt2, $1, $2, $3, $4, $5, a[n-2], a[n-1], a[n] } # 5 + 3 fields
' "file 2" > "file 3"
Выход:
...
2500GRM C3 9999 15.433 8.378 0.000 0.2372 -0.2989 -0.0758
2500GRM C410000 15.310 8.449 0.000 0.2603 -0.2492 -0.2394
2501GRM C110001 15.310 8.591 0.000 0.0887 -0.2458 -0.7014
2501GRM C210002 15.433 8.662 0.000 -0.0788 0.0598 -0.9619
...