Mi archivo1 se ve así:

bla bla bla STRING_1 blabla STRING_2.
bla bla bla bla bla.

Mi archivo2 se ve así (separado por tabulaciones):

FILENAME   FIELD_1   FIELD_2
out1   ABCDEF   GHIJKL
out2   MNOPQR   STUVWX

Estoy tratando de reemplazar STRING_1 y STRING_2 del archivo1 con los campos correspondientes del archivo2, y generar 2 archivos diferentes con su nombre como se muestra a continuación:

Out1:

bla bla bla ABCDEF blabla GHIJKL.
bla bla bla bla bla.

Out2:

bla bla bla MNOPQR blabla STUVWX.
bla bla bla bla bla.

Lo que intenté:

awk -F '\t' '
NR==FNR{
   if(NR>1){
      a[NR]=$1
      b[NR]=$2
      c[NR]=$3
      next
   }
}
{
   for(i=1; i<=FNR; i++){
      gsub(/STRING_1/,bi])
      gsub(/STRING_2/,c[i])
      print $0 > a[i]
   }
}
' file2.tab file1.tab

Este comando solo crea un archivo "FILENAME" que contiene lo siguiente:

bla bla bla FIELD_1 blabla FIELD_2.
bla bla bla bla bla.

Cualquier ayuda sería apreciada. Gracias !

NOTA: file1 es un archivo de plantilla único cuyo contenido no cambia.

0
user31888 29 ene. 2018 a las 18:23

1 respuesta

A continuación, le mostramos cómo implementar su enfoque de uso de gsub () s, sin probar:

awk '
NR==FNR {
    if (NR>1) {
        files[$1]
        for (i=2; i<=NF; i++) {
            map[$1,i-1] = $i
        }
    }
    next
}
{
    for (file in files) {
        rec = $0
        gsub(/STRING_1/,map[file,1],rec)
        gsub(/STRING_2/,map[file,2],rec)
        print rec > file
    }
}
' file2 file2

Tenga en cuenta que este enfoque tendrá problemas si STRING_1, etc. pueden contener metacaracteres de expresiones regulares, o si los de reemplazo pueden contener referencias inversas (&), o si son posibles coincidencias parciales (the reemplazado dentro de {{X2 }}). También puede que necesite cerrar () los archivos de salida sobre la marcha y usar >> para escribir en ellos si tiene muchos archivos de salida y no está usando GNU awk.

1
Ed Morton 29 ene. 2018 a las 16:19