Reordenar un archivo, basándose en un segundo archivo

Reordenar un archivo, basándose en un segundo archivo

Tengo un archivo que está desordenado. Me gustaría reordenarlo usando un segundo archivo.

Archivo 1

1 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0

2 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2315=27:2316=NAR@4;2317=eng@106:2318;2319=eng:0:21020:2:2066:0

3 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2320=27:2321=NAR@4;2322=eng@106:2323;2324=eng:0:21030:2:2066:0

ITV HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0

Y un segundo archivo

3 HD
1 HD
2 HD

Quiero escanear el archivo dos y reordenar el archivo 1, y los sobrantes se modifican hasta el final del archivo, por lo que el resultado final es

3 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2320=27:2321=NAR@4;2322=eng@106:2323;2324=eng:0:21030:2:2066:0
1 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0
2 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2315=27:2316=NAR@4;2317=eng@106:2318;2319=eng:0:21020:2:2066:0
ITV HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0

¿Algunas ideas?

Gracias de antemano.

Respuesta1

Dependiendo del tamaño del archivo, cargar cada línea en una matriz sería la forma más sencilla de manejar esto. Use su archivo de índice para obtener una clave de objeto (referencia al elemento en la matriz) y escriba esa línea, bucle, etc.

Veo que has etiquetado Linux/bash, así que aquí tienes información de ayuda.

Los arreglos Bash sólo tienen índices numerados, pero son escasos, es decir, no es necesario definir todos los índices. Se puede asignar una matriz completa encerrando los elementos de la matriz entre paréntesis:

  arr=(Hello World)

Los elementos individuales se pueden asignar con la sintaxis de matriz familiar (a menos que esté acostumbrado a Basic o Fortran):

  arr[0]=Hello
  arr[1]=World

Pero se pone un poco feo cuando quieres hacer referencia a un elemento de matriz:

echo ${arr[0]} ${arr[1]}

Para citar la página de manual: Las llaves son necesarias para evitar conflictos con la expansión del nombre de ruta.

Además, están disponibles las siguientes construcciones originales:

  ${arr[*]}         # All of the items in the array
  ${!arr[*]}        # All of the indexes in the array
  ${#arr[*]}        # Number of items in the array
  ${#arr[0]}        # Length of item zero

El ${!arr[*]} es una adición relativamente nueva a bash, no formaba parte de la implementación original de la matriz.

El siguiente ejemplo muestra un uso simple de una matriz (tenga en cuenta la asignación "[índice]=valor" para asignar un índice específico):

#!/bin/bash

array=(one two three four [5]=five)

echo "Array size: ${#array[*]}"

echo "Array items:"
for item in ${array[*]}
do
    printf "   %s\n" $item
done

echo "Array indexes:"
for index in ${!array[*]}
do
    printf "   %d\n" $index
done
echo "Array items and indexes:"
for index in ${!array[*]}
do
    printf "%4d: %s\n" $index ${array[$index]}
done

Al ejecutarlo se produce el siguiente resultado: Tamaño de la matriz: 5 elementos de la matriz:

   one
   two
   three
   four
   five

Índices de matriz:

   0
   1
   2
   3
   5

Elementos de matriz e índices:

   0: one
   1: two
   2: three
   3: four
   5: five

Tenga en cuenta que se puede utilizar el signo "@" en lugar del "" en construcciones como ${arr[]}, el resultado es el mismo excepto cuando se expande a los elementos de la matriz dentro de una cadena entre comillas. En este caso el comportamiento es el mismo que al expandir "$" y "$@" entre comillas: "${arr[]}" devuelve todos los elementos como una sola palabra, mientras que "${arr[@]}" devuelve cada elemento como una palabra independiente.

Se puede encontrar mucha más información sobre las matrices bash enhttp://www.linuxjournal.com/content/bash-arrays

Para cargar un archivo en una matriz, puede usar algo como esto usando la variable X para agregar un índice a la matriz, o puede, dentro del bucle, extraer un índice personalizado.

#!/bin/sh

files="`cat $1`"

for x in $lines
    echo "$x"
done

Respuesta2

awk -F';' '
  NR == FNR {a[$1] = $0; next}
  {print a[$0]; delete a[$0]}
  END {for (l in a) print a[l]}' file1 file2

información relacionada