Otra pregunta awk (ward): subcadenas de mapeo con varias teclas

Tengo dos files que se ven así:

mapping.txt :

 100178 L08/2015 100180 L08/2015 103822 J03/2012 103823 A06/2012 103823 J02/2012 103823 J03/2012 ... 

input.txt :

 100180011|225| 100180011|226| 100181111|201| 100181111|202| 103823004|011| 103823004|012| ... 

output.txt en el que si los primeros 6 dígitos del file de input coinciden con una o más inputs del file de mapeo, la tercera columna aparece como la segunda columna del file de mapeo, sino "B00 / 0000":

 100180011|225|L08/2015 100180011|226|L08/2015 100181111|201|B00/0000 100181111|202|B00/0000 103823004|011|A06/2012 103823004|011|J02/2012 103823004|011|J03/2012 103823004|012|A06/2012 103823004|012|J02/2012 103823004|012|J03/2012 

Idealmente, esto debería funcionar en OSX, pero también tengo acceso a un cuadro de Linux.

Related of "Otra pregunta awk (ward): subcadenas de mapeo con varias teclas"

Asumiendo bash , y asumiendo que ambos files están orderados:

 join -a1 <(sed 's/./& /6' input.txt) mapping.txt | sed 's/ //g; s/|$/|B00\/0000/' 

Salida:

 100180011|225|L08/2015 100180011|226|L08/2015 100181111|201|B00/0000 100181111|202|B00/0000 103823004|011|A06/2012 103823004|011|J02/2012 103823004|011|J03/2012 103823004|012|A06/2012 103823004|012|J02/2012 103823004|012|J03/2012 

No hay awk a la vista, lo siento. 🙂

Editar: explicación:

  • sed 's/./& /6' – agrega un espacio después del sexto carácter en cada línea, por lo que la salida es 100180 011|225|L08/2015
  • join -a1 une a los files en la primera columna; -a1 le dice a join que no cambien las líneas no -a1 del primer file
  • sed 's/ //g;' – eliminar los espacios en el resultado
  • 's/|$/|B00\/0000/' – agrega /|B00/0000 a las líneas que terminan con | , es decir, a las líneas incomparables del primer file.

Puedes intentar seguir awk :

 awk 'NR == FNR { k = substr($1, 1, 6); x[$1,$2] = k; y[$1,$2] = 0; next; } { for (i in x) { if (x[i] == $1) { split(i, t, SUBSEP); print t[1] "|" t[2] "|" $2; y[i] = 1; } } } END { for (i in y) if (y[i] == 0) { split(i, t, SUBSEP); print t[1] "|" t[2] "|B00/0000" } }' FS="|" input.txt FS=" " mapping.txt 

El resultado debería ser:

 100180011|225|L08/2015 100180011|226|L08/2015 103823004|011|A06/2012 103823004|012|A06/2012 103823004|011|J02/2012 103823004|012|J02/2012 103823004|011|J03/2012 103823004|012|J03/2012 100181111|201|B00/0000 100181111|202|B00/0000