2010-10-15 7 views
3

J'écris un script qui va prendre un nom de fichier comme un argument, trouver un mot un mot spécifique au début de chaque ligne - le mot ATOM, dans ce cas - et imprimer les valeurs à partir de colonnes spécifiques.Imprimer des colonnes avec Awk ou Cut?

$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 

Je vais avoir du mal à comprendre trois problèmes:

  1. Comment utiliser awk pour imprimer uniquement les lignes qui contiennent ATOM comme premier mot
  2. Comment utiliser awk pour imprimer uniquement certaines colonnes à partir des lignes correspondant aux critères ci-dessus, en particulier les colonnes 2-20 et 38-40
  3. Comment puis-je indiquer que ce fichier doit être un fichier pdb? * Pdb *

Répondre

1

Contrairement à la réponse, votre tâche peut être accomplie avec une seule commande awk. Pas besoin grep ou couper ou ...

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 
+0

Cela fonctionne génial! Merci fantôme. – Koala

4
  1. Ce serait

    awk '$1 == "ATOM"' $FILE 
    
  2. Cette tâche est probablement mieux accompli avec cut:

    grep ^ATOM $FILE | cut -c 2-20,38-40 
    
  3. Si vous voulez vous assurer que le nom du fichier passé comme le premier argument à votre script se termine par .pdb: d'abord, s'il vous plaît ne pas (extensions de fichiers ne sont pas rea matière lly sous UNIX), et d'autre part, si vous devez, voici une façon:

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

    Cela prend le premier argument de ligne de commande ($1), bandes le suffixe .pdb si elle existe, puis la compare à la argument de ligne de commande d'origine. Si elles correspondent, il n'a pas eu le suffixe, de sorte que le programme imprime un message d'utilisation et quitte avec le code d'état 1.

+0

Merci David! Puis-je vous demander pourquoi vous dites «s'il vous plaît ne pas» pour que l'argument ne soit pas limité aux seuls fichiers .pdb? Si j'ai besoin que les colonnes imprimées soient seulement celles qui ont des entrées dans les colonnes 18-30, est-ce que je devrais les placer séparément? grep^ATOM $ 1 | coupe -f 18-30 | cut -f 2-20, 38-40 – Koala

+0

@Koala: Pour le nom de fichier, que se passe-t-il si vous voulez utiliser votre programme sur un fichier dont le nom se termine par '.txt'? Ou '.csv'? Ou '.bak'? Ou un fichier qui a un nom sans extension du tout? Cela ne semble-t-il pas stupide de faire échouer le programme simplement parce que le nom de fichier n'est pas conforme à une convention arbitraire? Bien sûr, c'est votre programme, donc vous pouvez le faire vérifier le nom de fichier si vous voulez, mais si mon expérience est un guide, il viendra un jour où vous voudrez vous débarrasser de cette vérification. D'autres utilitaires UNIX (par exemple 'grep' et' awk') ne vérifient pas les noms de fichiers; il y a une raison à cela. –

+0

En ce qui concerne la deuxième partie de votre question, à propos des colonnes, je ne comprends pas vraiment ce que vous demandez. –

Questions connexes