2番目のファイルに基づいてファイルを並べ替える

2番目のファイルに基づいてファイルを並べ替える

順序が正しくないファイルがあります。 2番目のファイルを使って並べ替えたいです。

ファイル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

2番目のファイルがあります

3 HD
1 HD
2 HD

ファイル2をスキャンし、ファイル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

関連情報