順序が正しくないファイルがあります。 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