{"id":726,"date":"2023-10-18T13:14:49","date_gmt":"2023-10-18T11:14:49","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/?page_id=726"},"modified":"2025-02-10T21:37:23","modified_gmt":"2025-02-10T19:37:23","slug":"1-13-3-sintesis-condensada-de-gawk","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/1-13-3-sintesis-condensada-de-gawk\/","title":{"rendered":"1.13.3. S\u00edntesis condensada de GAWK"},"content":{"rendered":"<p>GAWK no es limita a ser una eina de filtratge de text estructurat; \u00e9s un llenguatge de programaci\u00f3 complet que compta amb estructures de control de flux, bucles, diversos operadors i funcions integrades per treballar tant amb cadenes de car\u00e0cters com amb n\u00fameros. A m\u00e9s, et brinda la possibilitat de controlar el format de la sortida impresa, utilitzar estructures de dades i escriure funcions <em>ad hoc<\/em>. La combinaci\u00f3 intel\u00b7ligent d\u2019aquests elements et permetr\u00e0 crear programes per realitzar transformacions complexes en arxius de text, com podr\u00e0s veure en molts dels exemples que es presenten a continuaci\u00f3.<\/p>\n<p>La seg\u00fcent llista presenta alguns dels elements i estructures sint\u00e0ctiques essencials del llenguatge de programaci\u00f3 <code>gawk<\/code>. Tot i que pretenem cobrir tots aquests elements en profunditat, aquesta llista et donar\u00e0 una idea del poder i la flexibilitat de <code>gawk<\/code> com a llenguatge de programaci\u00f3.<\/p>\n<ul>\n<li><strong>condicionals<\/strong><\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">if(condici\u00f31){code1}else\r\n\r\nif(condici\u00f32){code2}else\r\n\r\n{code3}<\/pre>\n<ul>\n<li><strong>bucles <em>for<\/em> <\/strong><\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">for (i in array) {code};\u00a0\r\n\r\n\r\nfor (initialization;condition;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 increment|decrement)<\/pre>\n<ul>\n<li><strong>bucles <em>while<\/em><\/strong><\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">while(true){code}<\/pre>\n<ul>\n<li><strong>operadors aritm\u00e8tics<\/strong><\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">+, -, *, \/, %, =, ++, \u2013, +=, -=, \u2026)<\/pre>\n<ul>\n<li><strong>operadors boleans<\/strong><\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">||, &amp;&amp;<\/pre>\n<ul>\n<li><strong>operadors relacionals<\/strong><\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">&lt;, &lt;=, ==, !=,&gt;=, &gt;<\/pre>\n<ul>\n<li><strong>funcions integrades<\/strong><\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">length(str); int(num); index (str1, str2); split(str,arr,del); substr(str,pos,len); printf(fmt,args); tolower(str); toupper(str); gsub(regexp, replacement [, target])<\/pre>\n<ul>\n<li><strong>funcions escrites per l&#8217;usuario<\/strong><\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">function FUNNAME (arg1, arg1) {code}<\/pre>\n<ul>\n<li><strong>estructures de dades<\/strong><\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">(hashes o arranjaments associatius): array[string]=value<\/pre>\n<p>Avaluem el potencial de <code>gawk<\/code>. Els conjunts de dades gen\u00f2miques sovint es distribueixen amb arxius separats per a cada cromosoma, i generalment necessitem realitzar la mateixa operaci\u00f3 en cadascun. Per realitzar aquesta tasca, podem fer servir l\u2019estructura de bucle <em>for <\/em>de la<em> shell<\/em>. Si tingu\u00e9ssim arxius anomenats <code>data_chr[chromosome].txt<\/code>, on [chromosome] varia d\u20191 a 22, i volgu\u00e9ssim executar .\/command en ells, s\u2019escriurien les seg\u00fcents ordres al terminal:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ for i in {1..22}; do .\/command data_chr$i.txt; done<\/pre>\n<p>El codi anterior recorre tots els valors entre 1 i 22, establint la variable de la <code>shell<\/code> $i en cada valor, successivament. La sintaxi per especificar els rangs de n\u00fameros \u00e9s que <code>{A..B}<\/code> dona un rang entre <em>A<\/em> i <em>B<\/em>, on <em>A<\/em> i <em>B<\/em> s\u00f3n valors sencers.<\/p>\n<p>Tamb\u00e9 podem fer servir <code>for<\/code> per rec\u00f3rrer les extensions d\u2019arxiu. Suposem que ten\u00edem algunes dades en format PLINK anomenades <code>data.bed<\/code>, <code>data.bim<\/code> i <code>data.fam<\/code>. Podr\u00edem llistar aquests arxius individualment executant:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ for ext in bed bim fam; do ls data.$ext; done<\/pre>\n<p>Aqu\u00ed, la variable <code>$ext<\/code> (per a extensi\u00f3) s\u2019estableix successivament en <em>bed<\/em>, <em>bim <\/em>i <em>fam<\/em>. Aquest exemple en particular no \u00e9s gaire \u00fatil, ja que podr\u00edem haver escrit <code>ls data.*<\/code> i vist que existeixen aquests tres arxius. El que \u00e9s \u00fatil \u00e9s poder reanomenar el conjunt de dades base amb una sola l\u00ednia de codi a la <em>shell<\/em>. Si es volguessin reanomenar aquests arxius\u00a0 <code>human_data.bed, human_data.bim<\/code> i\u00a0<code>human_data.fam<\/code>, es podria escriure:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ for ext in bed bim fam; do mv -i data.$ext human_data.$ext; done<\/pre>\n<p>Una altra construcci\u00f3 <code>for<\/code> \u00fatil \u00e9s rec\u00f3rrer grups d\u2019arxius. Podem fer el seg\u00fcent per executar <code>.\/command<\/code> a cada arxiu amb extensi\u00f3 .txt en el nostre directori actual:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ for file in *.txt; do .\/command $file; done<\/pre>\n<p>Ara, suposem que tenim un arxiu anomenat <em>data.txt<\/em> i que volem separar la informaci\u00f3 corresponent a cada cromosoma en arxius separats. Podr\u00edem fer servir un bucle <em>for<\/em> per rec\u00f3rrer cada n\u00famero de cromosoma i despr\u00e9s una expressi\u00f3 booleana en <code>gawk<\/code> per extreure nom\u00e9s les l\u00ednies corresponents a aquest cromosoma. Comencem la nostra tasca amb un programa que no funciona del tot i despr\u00e9s ho arreglarem.<\/p>\n<p>Si la columna 2 de <em>data.txt<\/em> cont\u00e9 els n\u00fameros de cromosoma i volem arxius separats per a cada cromosoma, podr\u00edem pensar que el seg\u00fcent funciona (tingues en compte, novament, el comportament predeterminat de <code>gawk<\/code> per imprimir les l\u00ednies que coincideixen amb l\u2019expressi\u00f3 booleana donada):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ for chr in {1..22}; do awk '$2 == $chr' data.txt &gt; data_chr$chr.txt; done<\/pre>\n<p>Aix\u00f2 \u00e9s gaireb\u00e9 correcte, per\u00f2 l\u2019expressi\u00f3 donada en g<em>awk<\/em> \u00e9s <code>'$2 == $chr' gawk<\/code> no l\u2019ent\u00e9n, perqu\u00e8 no coneix ni sap res sobre la variable de la <em>shell<\/em> <code>$chr<\/code> que s\u2019ha definit. En lloc de fer refer\u00e8ncia a una variable a la <em>shell<\/em>, podem assignar expl\u00edcitament variables perqu\u00e8 gawk les usi amb l\u2019opci\u00f3 -v:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ for chr in {1..22}; do awk -v chr=$chr '$2 == chr' data.txt &gt; data_chr$chr.txt; done<\/pre>\n<p>No est\u00e0 malament! Podem proporcionar a <code>gawk<\/code> tantes opcions -v com volem per a totes les variables que haguem d\u2019assignar:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ for chr in {1..22};\r\n \u00a0 do awk -v chr=$chr -v threshold=10 '$2 == chr &amp;&amp; $4 &gt; threshold' data.txt\r\n\r\n\u00a0\u00a0 &gt; data_chr$chr.txt; done<\/pre>\n<p>Aix\u00f2 separa cada cromosoma en un arxiu individual amb la condici\u00f3 que els valors a la columna 4 siguin majors que 10.<\/p>\n<p>Qu\u00e8 passa si tenim un arxiu que cont\u00e9 dues columnes amb un recompte d\u2019\u00ab\u00e8xits\u00bb i \u00abintents\u00bb per a algun proc\u00e9s, cadascun recol\u00b7lectat d\u2019una font diferent, i volem calcular la taxa mitjana d\u2019\u00e8xit entre totes les fonts? Podem fer servir <code>gawk<\/code> per sumar cada columna i despr\u00e9s imprimir la mitjana al final fent servir una sintaxi especial. Si l\u2019arxiu <em>data.txt<\/em> t\u00e9 els \u00e8xits i els intents a les columnes 2 i 3, respectivament, podr\u00edem fer aix\u00f2:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ gawk 'BEGIN\r\n {total_success = total_attempts = 0;}\r\n\r\n\u00a0{total_success += $2; total_attempts += $3}\r\n\r\nEND\r\n\r\n{print \"\u00c9xitos:\", total_success, \"Intentos:\", total_attempts, \"Tasa:\", total_success \/ total_attempts}' data.txt<\/pre>\n<p>L\u2019ordre <code>gawk<\/code> executa el codi a la secci\u00f3 BEGIN abans de processar qualsevol l\u00ednia a l\u2019entrada i el codi a la secci\u00f3 END despr\u00e9s de llegir l\u2019entrada. La secci\u00f3 BEGIN inicialitza dues variables a 0, la secci\u00f3 de codi principal suma les columnes a cada l\u00ednia, i la secci\u00f3 END imprimeix els totals i la taxa.<\/p>\n<p>Suposem ara que volem buscar mitjan\u00e7ant condicionals aquells assemblatges que cont\u00e9 l\u2019organisme a<em> Xenopus tropicalis<\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ gawk ' BEGIN {\r\n \u00a0\u00a0 FS=\"\\t\";\r\n\r\n\u00a0\u00a0\u00a0 print \"assembly_accession\\torganism_name\\tseq_rel_date\\tasm_name\\tsubmitter\"\r\n\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\r\n\r\n{\r\n\r\n\u00a0\u00a0\u00a0 if ($2 == \"Xenopus tropicalis\") {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print $1 \"\\t\" $2 \"\\t\" $3 \"\\t\" $4 \"\\t\" $5\r\n\r\n\u00a0\u00a0\u00a0 }\r\n\r\n}\r\n\r\n' ensamble.txt<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">GCA_017527675.1 Phaeodactylum tricornutum\u00a0 2022-03-24 Phatr3.0\u00a0\u00a0 NCBI\r\n\r\nGCA_011586775.1 Xenopus tropicalis\u00a0\u00a0 2022-04-11 Xenbase_v9.2\u00a0\u00a0\u00a0 NCBI<\/pre>\n<p>En el seg\u00fcent exemple, es volen filtrar les dades de Xenopus tropicalis que tinguin una data de llan\u00e7ament inferior al 2015. L\u2019exemple utilitzar\u00e0 un condicional en <em>bash<\/em> i es crear\u00e0 <em>script<\/em> que es pugui executar. Salva les pr\u00f2ximes ordres en un fitxer del teu terminal.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">#!\/bin\/bash<\/pre>\n<p># Llegir la taula i guardar les l\u00ednies que compleixen les condicions en un nou arxiu<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">awk -F'\\t' 'NR==1 || ($2 == \"Xenopus tropicalis\" &amp;&amp; $3 &gt; \"2015-01-01\")' $1 &gt; filtered_table.txt<\/pre>\n<p># Comptar el nombre de l\u00ednies a l\u2019arxiu filtrat<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">num_lines=$(wc -l &lt; filtered_table.txt)<\/pre>\n<p># Si el nombre de l\u00ednies \u00e9s m\u00e9s gran que 1 (\u00e9s a dir, si hi ha entrades que compleixen les condicions),<\/p>\n<p># imprimir un missatge i el contingut de l\u2019arxiu filtrat<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">if [ $num_lines -gt 1 ]; then\r\n\r\n\u00a0 echo \"Es van trobar les seg\u00fcents entrades per a Xenopus tropicalis publicades despr\u00e9s de 2015-01-01:\"\r\n\r\n\u00a0 cat filtered_table.txt\r\n\r\n# Si el nombre de l\u00ednies \u00e9s igual a 1, imprimir un missatge amb el nom de l\u2019entrada\r\nelif [ $num_lines -eq 1 ]; then\r\n\r\n\u00a0 echo \"Se encontr\u00f3 la siguiente entrada para Xenopus tropicalis publicada despu\u00e9s de 2015-01-01:\"\r\n\r\n\u00a0 awk -F'\\t' '{print $4}' filtered_table.txt<\/pre>\n<p># Si el nombre de l\u00ednies \u00e9s 0, imprimir un missatge que digui que no es van trobar entrades que compleixin les condicions<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">else\r\n\r\n\u00a0 echo \"No es van trobar entrades per a Xenopus tropicalis publicades despr\u00e9s de 2015-01-01.\"\r\n\r\nfi<\/pre>\n<p>Salva el fitxer i executa les seg\u00fcents ordres en el terminal:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">\u00a0\u00a0\u00a0\u00a0 $ chmod +x script.sh<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\"> \u00a0\u00a0\u00a0 $ .\/script.sh ensamble.txt\r\n<\/pre>\n<p>Aquest <em>script<\/em> utilitza <code>gawk<\/code> per llegir la taula i guardar les l\u00ednies que compleixen les condicions en un nou arxiu anomenat <em>filtered_table.txt.<\/em> Despr\u00e9s, compta el nombre de l\u00ednies en aquest arxiu i utilitza dues condicions <em>if<\/em> per imprimir missatges diferents depenent de si hi ha entrades que compleixin les condicions o no. En el primer cas, quan hi ha m\u00e9s d\u2019una entrada que compleix les condicions, l\u2019<em>script<\/em> imprimeix un missatge que indica que es van trobar entrades i mostra el contingut de la taula filtrada. En el segon cas, imprimeix un missatge si nom\u00e9s hi ha una entrada que compleix la condici\u00f3 i l\u2019\u00faltima acci\u00f3 ocorrer\u00e0 si no hi ha cap entrada en el fitxer de partida que compleixi les condicions demandades.<\/p>\n<p>La taula 12 \u00e9s un llistat de les operacions m\u00e9s comunes i utilitzades amb GAWK.<\/p>\n<div class=\"tabletitle\"><\/p>\n<p>Taula 12. Operacions utilitzades a GAWK.<\/p>\n<\/div>\n<table width=\"602\">\n<tbody>\n<tr class=\"table-header\">\n<td width=\"123\"><strong>Variable<\/strong><\/td>\n<td width=\"480\"><strong>Descripci\u00f3<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><code>i=0<\/code><\/td>\n<td width=\"480\">Assignar un valor<\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><code>a[i]=0;<\/code><\/td>\n<td width=\"480\">Guardar un valor en una taula<\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><code>i++;<\/code><\/td>\n<td width=\"480\">Incrementar un comptador<\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><code>print i;<\/code><\/td>\n<td width=\"480\">Mostrar una variable per pantalla<\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><code>print NR<\/code><\/td>\n<td width=\"480\">Mostrar el nombre de l\u00ednies processades<\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><code>print $1,$4<\/code><\/td>\n<td width=\"480\">Mostrar la primera i quarta columnes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"tablefooter\"><p>Font: elaboraci\u00f3 pr\u00f2pia.<\/p>\n<\/div>\n<p>I a la taula 13 es mostren exemples d\u2019instruccions condicionals amb GAWK.<\/p>\n<div class=\"tabletitle\"><p>Taula 13. Instruccions condicionals amb GAWK.<\/p>\n<\/div>\n<table width=\"602\">\n<tbody>\n<tr class=\"table-header\">\n<td width=\"246\"><strong>Variable<\/strong><\/td>\n<td width=\"357\"><strong>Descripci\u00f3<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"246\"><code>if ($1 &gt; 0) print $0;\u00a0<\/code><\/td>\n<td width=\"357\">Si la primera \u00e9s positiva<\/td>\n<\/tr>\n<tr>\n<td width=\"246\"><code>if ($1 &lt; 0) print $0;\u00a0<\/code><\/td>\n<td width=\"357\">Si la primera \u00e9s negativa<\/td>\n<\/tr>\n<tr>\n<td width=\"246\"><code>if ($1 &gt;= 0) print $0;\u00a0<\/code><\/td>\n<td width=\"357\">Si la primera columna \u00e9s major o igual a zero<\/td>\n<\/tr>\n<tr>\n<td width=\"246\"><code>if ($1 &lt;= 0) print $0;\u00a0<\/code><\/td>\n<td width=\"357\">Si la primera columna \u00e9s menor o igual a zero<\/td>\n<\/tr>\n<tr>\n<td width=\"246\"><code>if ($1 == 0) print $0;\u00a0<\/code><\/td>\n<td width=\"357\">Si la primera columna \u00e9s igual a zero<\/td>\n<\/tr>\n<tr>\n<td width=\"246\"><code>if (CONDICI\u00d31) &amp;&amp; (CONDICI\u00d32)<\/code><\/td>\n<td width=\"357\">Si es compleixen les dues condicions<\/td>\n<\/tr>\n<tr>\n<td width=\"246\"><code>if (CONDICI\u00d31) || (CONDICI\u00d32<\/code><\/td>\n<td width=\"357\">Si es compleix alguna de les dues condicions<\/td>\n<\/tr>\n<tr>\n<td width=\"246\"><code>if \u00a1(CONDICI\u00d31)<\/code><\/td>\n<td width=\"357\">Si no es compleix la condici\u00f3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"tablefooter\"><p>Font: elaboraci\u00f3 pr\u00f2pia.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>GAWK no es limita a ser una eina de filtratge de text estructurat; \u00e9s un llenguatge de programaci\u00f3 complet que compta amb estructures de control de flux, bucles, diversos operadors i funcions integrades per treballar tant amb cadenes de car\u00e0cters com amb n\u00fameros. A m\u00e9s, et brinda la possibilitat de controlar el format de la [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages\/726"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/comments?post=726"}],"version-history":[{"count":18,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages\/726\/revisions"}],"predecessor-version":[{"id":1257,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages\/726\/revisions\/1257"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/media?parent=726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}