Reordenando um arquivo com base em um segundo arquivo

Reordenando um arquivo com base em um segundo arquivo

Eu tenho um arquivo que está fora de ordem. Gostaria de reordená-lo usando um segundo arquivo.

Arquivo 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

E um segundo arquivo

3 HD
1 HD
2 HD

Quero digitalizar o arquivo dois e reordenar o arquivo 1, e as sobras serão alteradas até o final do arquivo, então o resultado final é

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

Alguma ideia?

Desde já, obrigado.

Responder1

Dependendo do tamanho do arquivo, carregar cada linha em um array seria a maneira mais fácil de lidar com isso. Use seu arquivo de índice para obter uma chave de objeto (referência ao item na matriz) e escreva essa linha, loop, etc.

Vejo que você marcou Linux/bash, então aqui estão algumas informações auxiliares.

Arrays Bash possuem apenas índices numerados, mas são esparsos, ou seja, você não precisa definir todos os índices. Um array inteiro pode ser atribuído colocando os itens do array entre parênteses:

  arr=(Hello World)

Itens individuais podem ser atribuídos com a sintaxe de array familiar (a menos que você esteja acostumado com Basic ou Fortran):

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

Mas fica um pouco feio quando você quer se referir a um item do array:

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

Para citar a página de manual: Os colchetes são necessários para evitar conflitos com a expansão do nome do caminho.

Além disso, as seguintes construções descoladas estão disponíveis:

  ${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

O ${!arr[*]} é uma adição relativamente nova ao bash, não fazia parte da implementação original do array.

O exemplo a seguir mostra alguns usos simples de array (observe a atribuição "[index]=value" para atribuir um í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

Executá-lo produz a seguinte saída: Tamanho do array: 5 itens do array:

   one
   two
   three
   four
   five

Índices de matriz:

   0
   1
   2
   3
   5

Itens e índices da matriz:

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

Observe que o sinal "@" pode ser usado em vez do "" em construções como ${arr[]}, o resultado é o mesmo, exceto ao expandir para os itens da matriz dentro de uma string entre aspas. Neste caso o comportamento é o mesmo que ao expandir "$" e "$@" entre as strings entre aspas: "${arr[]}" retorna todos os itens como uma única palavra, enquanto "${arr[@]}" retorna cada item como uma palavra separada.

Muito mais informações sobre arrays bash são encontradas emhttp://www.linuxjournal.com/content/bash-arrays

Para carregar um arquivo em um array, você poderia usar algo assim usando a variável X para adicionar um índice ao array, ou você poderia, dentro do loop, extrair um índice personalizado.

#!/bin/sh

files="`cat $1`"

for x in $lines
    echo "$x"
done

Responder2

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

informação relacionada