
順序が乱れたファイルがあります。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