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
4 Réponses :
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
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
Merci beaucoup! Je ne savais pas que le parrain de l'âme était un aficionado maladroit!
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.
$ awk -F'[: ]+' '{print (NR==1 ? "MarkerName P-Value" : $2":"$3" "$NF)}' file MarkerName P-Value chr1:1243 0.14
Utilisez
split($2,a,/:/)
etprintf "%s:%s %s\n",a[1],a[2],$12
.J'ai implémenté mon commentaire ci-dessous en tant que réponse.