5
votes

Reformatage d'un fichier texte en utilisant awk et coupé en une seule ligne

Les données:

awk '{print $2, $12}' | cut -d: -f1-2

Sortie désirée:

MarkerName P-Value 
  chr1:1243  0.14

Le fichier réel fait 1,2G de lignes comme ci-dessus

J'ai besoin de dépouiller la 2ème colonne du texte au-delà du 2ème deux-points, puis collez-la dans la 12ème colonne finale et donnez-lui un nouvel en-tête.

J'ai essayé:

CHR SNP BP A1 TEST NMISS BETA SE L95 U95 STAT P 
1   chr1:1243:A:T 1243 T ADD 16283 -6.124 0.543 -1.431 0.3534 -1.123 0.14

mais cela supprime toute la ligne après les deux-points et je souhaite conserver la colonne "p"

Je l'ai sorti dans un nouveau fichier, puis je l'ai collé sur la colonne de valeur P en utilisant awk, mais je me demandais s'il y avait une méthode à une ligne pour le faire?

Merci beaucoup


2 commentaires

Utilisez split($2,a,/:/) et printf "%s:%s %s\n",a[1],a[2],$12 .


J'ai implémenté mon commentaire ci-dessous en tant que réponse.


4 Réponses :


4
votes

EDIT: Ajouter une autre solution ici, puisque OP a mentionné que ma première solution ne fonctionnait pas pour OP mais cela fonctionnait bien pour moi, comme alternative en ajoutant ceci ici.

awk -F' +|:' '                 ##Starting awk program from here and setting field separator as spaces or colon for all lines.
BEGIN{                         ##Starting BEGIN section of this program from here.
  print "MarkerName P-Value"   ##Printing headers here.
}
FNR>1{                         ##Checking condition if line number is greater than 1 then do following.
  print OFS $2":"$3,$NF        ##Printing space(OFS) 2nd field colon 3rd field and last field as per OP request.
}
' Input_file                   ##Mentioning Input_file name here.


Avec des exemples illustrés, pourriez-vous s'il vous plaît essayer de suivre. Vous n'avez pas besoin d'utiliser cut avec awk , awk pourrait s'occuper de tout en lui-même.

awk -F' +|:' '
BEGIN{
  print "MarkerName P-Value"
}
FNR>1{
  print OFS $2":"$3,$NF
}
' Input_file

Explication: Ajout d'une explication détaillée ci-dessus.

awk '
BEGIN{
  print "MarkerName P-Value"
}
FNR>1{
  match($2,/([^:]*:){2}/)
  print OFS substr($2,RSTART,RLENGTH-1),$NF
}
' Input_file


0 commentaires

8
votes

Mon commentaire sous une forme plus compréhensible:

MarkerName P-Value
chr1:1243 0.14

Production:

$ awk '
BEGIN {
    print "MarkerName P-Value"          # output header
}
NR>1 {                                  # skip the funky first record
    split($2,a,/:/)                     # split by :
    printf "%s:%s %s\n",a[1],a[2],$12   # printf allows easier output formating
}' file


1 commentaires

Merci beaucoup! Je ne savais pas que le parrain de l'âme était un aficionado maladroit!



1
votes

Alternative Sed:

sed -En '1{s/^.*$/MarkerName\tP-Value/p};s/([[:digit:]]+[[:space:]]+)([[:alnum:]]+:[[:digit:]]+)(.*)([[:digit:]]+\.[[:digit:]]+$)/\2\t\4/p'

Pour la première ligne, remplacez la ligne complète par les en-têtes. Ensuite, divisez la ligne en 4 sections basées sur des expressions régulières, puis imprimez la 2ème sous-section suivie d'un onglet puis de la 4ème sous-section.


0 commentaires

2
votes
$ awk -F'[: ]+' '{print (NR==1 ? "MarkerName P-Value" : $2":"$3" "$NF)}' file
MarkerName P-Value
chr1:1243 0.14

0 commentaires