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[「]}」はすべての項目を 1 つの単語として返しますが、「${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

関連情報