Вставка нового столбца с отдельными строками сохранения символов определенной длины

Мне нужно вставить столбец после четвертого столбца с символом «A».

Каждая строка должна иметь ровно 80 символов (включая пробелы) перед новой строкой; если нет, мы можем добавить пробелы для выравнивания. Мне нужно сделать это для большого количества файлов.

Пример представления одного файла:

До:

ATOM 558 O VAL 86 -12.863 -8.701 -49.495 1.00 64.57 O ATOM 560 CA VAL 87 -13.628 -10.486 -47.550 1.00 58.11 C ..... ..... .....

После:

ATOM 558 O VAL A 86 -12.863 -8.701 -49.495 1.00 64.57 O ATOM 560 CA VAL A 87 -13.628 -10.486 -47.550 1.00 58.11 C ....... .......
3
задан 19 August 2017 в 12:31

4 ответа

Использование perl:

perl -lane '$"="\t"; print sprintf("%-80s", "@F[0..3]\tA\t@F[4..10]");' file

Выход:

ATOM 558 O VAL A 86 -12.863 -8.701 -49.495 1.00 64.57 O ATOM 560 CA VAL A 87 -13.628 -10.486 -47.550 1.00 58.11 C

Чтобы проверить, что длина точно равна «80», передайте вывод на awk '{ print length($0), "->", $0 }':

$ perl ... | awk '{ print length($0), "->", $0 }' 80 -> ATOM 558 O VAL A 86 -12.863 -8.701 -49.495 1.00 64.57 O 80 -> ATOM 560 CA VAL A 87 -13.628 -10.486 -47.550 1.00 58.11 C
2
ответ дан 18 July 2018 в 08:16

Возможно, вы можете просто заменить одно пространство в столбце 5?

$ sed 's/ / A/5' file ATOM 558 O VAL A 86 -12.863 -8.701 -49.495 1.00 64.57 O ATOM 560 CA VAL A 87 -13.628 -10.486 -47.550 1.00 58.11 C

Вы можете передать несколько имен файлов в sed, просто используйте оболочку glob, например *.txt, или что-нибудь, что поймает файлы, которые вы

Используйте флаг -i после тестирования, чтобы изменить файлы.

Это не изменит символы в строке ... Если вам нужно проложить строки до 80 символов, вы можете использовать что-то вроде

sed 's/ / A/5' file | awk '{printf "%-80s\n", $0}'
4
ответ дан 18 July 2018 в 08:16

Использование perl:

perl -lane '$"="\t"; print sprintf("%-80s", "@F[0..3]\tA\t@F[4..10]");' file

Выход:

ATOM 558 O VAL A 86 -12.863 -8.701 -49.495 1.00 64.57 O ATOM 560 CA VAL A 87 -13.628 -10.486 -47.550 1.00 58.11 C

Чтобы проверить, что длина точно равна «80», передайте вывод на awk '{ print length($0), "->", $0 }':

$ perl ... | awk '{ print length($0), "->", $0 }' 80 -> ATOM 558 O VAL A 86 -12.863 -8.701 -49.495 1.00 64.57 O 80 -> ATOM 560 CA VAL A 87 -13.628 -10.486 -47.550 1.00 58.11 C
2
ответ дан 24 July 2018 в 19:03

Возможно, вы можете просто заменить одно пространство в столбце 5?

$ sed 's/ / A/5' file ATOM 558 O VAL A 86 -12.863 -8.701 -49.495 1.00 64.57 O ATOM 560 CA VAL A 87 -13.628 -10.486 -47.550 1.00 58.11 C

Вы можете передать несколько имен файлов в sed, просто используйте оболочку glob, например *.txt, или что-нибудь, что поймает файлы, которые вы

Используйте флаг -i после тестирования, чтобы изменить файлы.

Это не изменит символы в строке ... Если вам нужно проложить строки до 80 символов, вы можете использовать что-то вроде

sed 's/ / A/5' file | awk '{printf "%-80s\n", $0}'
4
ответ дан 24 July 2018 в 19:03
  • 1
    его работа, но мы должны проверить, каждая строка состоит из 80 символов, включая пространство. Теперь его всего 78 символов. Как я могу сделать это для более чем lakh-файла, состоящего в папке за раз. Как вставить в цикл? Я просто баллотировался на один файл. – Nitha 19 August 2017 в 12:38
  • 2
    он не работает должным образом. его производящая новая линия между каждой строкой и столбцом A встречается только в определенном столбце. ATOM 585 CA GLY A 90 -13.860 -10.427 -52.700 1.00 25.12 C ATOM 587 O GLY A 90 -14.834 -12.085 -54.087 1.00 25.12 O ATOM 600 ND1 ЕЕ A93 -13.292 -11.141 -58.744 1.00 46.53 N ATOM 601 CG ЕГО A 93 -13.920 -10.048 -58.188 1.00 46.53 C – Nitha 19 August 2017 в 12:48

Другие вопросы по тегам:

Похожие вопросы: