Печать столбцов с помощью Awk или Cut? - PullRequest
3 голосов
/ 15 октября 2010

Я пишу скрипт, который будет принимать имя файла в качестве аргумента, находить слово с определенным словом в начале каждой строки - в данном случае словом ATOM - и печатать значения из определенных столбцов.

$FILE=*.pdb *

if test $# -lt 1
then
 echo "usage: $0 Enter a .PDB filename"
 exit
fi
if test -r $FILE
then
 grep ^ATOM $FILE | awk '{ print $18 }' | awk '{ print NR $4, "\t" $38,}'
else
 echo "usage: $FILE must be readable"
 exit
fi

У меня проблемы с выяснением трех проблем:

  1. Как использовать awk для печати только строк, которые содержат ATOM в качестве первого слова
  2. Как использовать awk для печати только определенных столбцов из строк, которые соответствуют вышеуказанным критериям, в частности столбцы 2-20 и 38-40
  3. Как я могу указать, что это должен быть файл pdb? * .pdb *

Ответы [ 2 ]

4 голосов
/ 15 октября 2010
  1. Это было бы

    awk '$1 == "ATOM"' $FILE
    
  2. Вероятно, эту задачу лучше выполнить с помощью cut:

    grep ^ATOM $FILE | cut -c 2-20,38-40
    
  3. Если вы хотите убедиться, что имя файла, переданное в качестве первого аргумента вашему скрипту, оканчивается на .pdb: во-первых, пожалуйста, не надо (расширения файлов не имеют большого значения в UNIX), а во-вторых, если Вы должны, вот один из способов:

    "${1%%.pdb}" == "$1" && echo "usage:..." && exit 1
    

    Он принимает первый аргумент командной строки ($1), удаляет суффикс .pdb, если он существует, и затем сравнивает его с исходным аргументом командной строки. Если они совпадают, у него нет суффикса, поэтому программа печатает сообщение об использовании и завершает работу с кодом состояния 1.

1 голос
/ 16 октября 2010

Вопреки ответу, ваша задача может быть выполнена с помощью одной команды awk. Не нужно grep или вырезать или ...

if [ $# -lt 1 ];then
 echo "usage: $0 Enter a .PDB filename"
 exit
fi
FILE="$1"
case "$FILE" in
*.pdb )

if test -r $FILE
then 
 # do for 2-20 assuming whites paces as column separators
 awk '$1=="ATOM" && NF>18 { 
   printf "%s ",$2
   for(i=3;i<=19;i++){
     printf "%s ",$i
   }
   printf "%s",$20   
 }' "$FILE"
else
 echo "usage: $FILE must be readable"
 exit
fi
;;
*) exit;;
esac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...