Изменение порядка файла на основе второго файла

Изменение порядка файла на основе второго файла

У меня есть файл, который находится в неправильном порядке. Я хотел бы упорядочить его, используя второй файл.

Файл 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

И второй файл

3 HD
1 HD
2 HD

Я хочу отсканировать файл два и изменить порядок файла 1, а оставшиеся части изменить в конце файла, так что конечный результат будет таким:

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

Есть идеи?

Заранее спасибо.

решение1

В зависимости от размера файла, загрузка каждой строки в массив будет самым простым способом справиться с этим. Используйте свой индексный файл, чтобы получить ключ объекта (ссылку на элемент в массиве) и запишите эту строку, цикл и т. д.

Я вижу, что вы указали тег Linux/bash, поэтому вот некоторая вспомогательная информация.

Массивы Bash имеют только пронумерованные индексы, но они разреженные, т.е. вам не нужно определять все индексы. Весь массив можно назначить, заключив элементы массива в скобки:

  arr=(Hello World)

Отдельные элементы можно назначать с помощью знакомого синтаксиса массива (если вы не привыкли к Basic или Fortran):

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

Но когда вы хотите обратиться к элементу массива, ситуация становится немного некрасивой:

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

Цитата из страницы руководства: Скобки необходимы для избежания конфликтов с расширением имени пути.

Кроме того, доступны следующие необычные конструкции:

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

${!arr[*]} — относительно новое дополнение к bash, оно не было частью оригинальной реализации массива.

В следующем примере показано простое использование массива (обратите внимание на назначение «[index]=value» для назначения определенного индекса):

#!/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

Запуск выводит следующий результат: Размер массива: 5 Элементы массива:

   one
   two
   three
   four
   five

Индексы массива:

   0
   1
   2
   3
   5

Элементы массива и индексы:

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

Обратите внимание, что вместо знака «@» можно использовать знак «" в таких конструкциях, как ${arr[]}, результат тот же, за исключением случаев, когда расширяется до элементов массива внутри строки в кавычках. В этом случае поведение такое же, как при расширении "$" и "$@" внутри строк в кавычках: "${arr[]}" возвращает все элементы как одно слово, тогда как "${arr[@]}" возвращает каждый элемент как отдельное слово.

Более подробную информацию о массивах bash можно найти на сайтеhttp://www.linuxjournal.com/content/bash-arrays

Чтобы загрузить файл в массив, можно использовать что-то вроде этого, используя переменную X для добавления индекса в массив, или можно внутри цикла извлечь пользовательский индекс.

#!/bin/sh

files="`cat $1`"

for x in $lines
    echo "$x"
done

решение2

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

Связанный контент