別のファイルの「インデックス」に基づいてテキストファイルの行を並べ替えようとしています。これにより、テキストファイルは、インデックスファイルと同じ順序で行ごとに配置されます。
次のコードは、私が探していることを実現しますが、これを一般的なスクリプトにするために、file_to_sort.txt
を別の変数に置き換えます(2つのコマンドライン引数を渡すことができるようにします)。 whileループでこれを処理する方法がわかりません。
while read line ; do grep $line file_to_sort.txt ; done < ../index.txt
並べ替えるファイルは次のようになります。
Locus ./PAK_01896.fsa GC: 0.401826484018
Locus ./PAK_02014.fsa GC: 0.355555555556
Locus ./PAK_02606.fsa GC: 0.415555555556
Locus ./PAK_03203.fsa GC: 0.391111111111
Locus ./PAU_01961.fsa GC: 0.395555555556
Locus ./PAU_02074.fsa GC: 0.406392694064
Locus ./PAU_02206.fsa GC: 0.353333333333
Locus ./PAU_02775.fsa GC: 0.415555555556
Locus ./PAU_03392.fsa GC: 0.384444444444
Locus ./PLT_01696.fsa GC: 0.42
Locus ./PLT_01716.fsa GC: 0.422222222222
Locus ./PLT_01736.fsa GC: 0.433333333333
Locus ./PLT_01758.fsa GC: 0.426666666667
Locus ./PLT_02424.fsa GC: 0.413333333333
Locus ./PLT_02568.fsa GC: 0.391111111111
また、インデックスの順序は次のようになります(したがって、出力は最初のファイルで、2番目の./xxx_xxxx
文字列に従ってソートされている必要があります)。
PAU_03392
PAK_03203
PAU_01961
PAK_01787
PLT_02568
PAU_02074
PAK_01896
PLT_02424
PAU_02775
PLT_01696
PAK_02606
PLT_01736
PLT_01758
PLT_01716
PAU_02206
PAK_02014
これは本当に簡単だと思いますが、私はそれを見ることができず、これを解決するために探していたものは、正しい答えを引きずっていませんでした(これは答えられたと確信しているのでどこかで)。
#!/bin/bash
FILE_TO_SORT="$1"
INDEX_FILE="$2"
TMP_FILE=$(mktemp)
while read LINE; do
grep "$LINE" "$FILE_TO_SORT" >>"$TMP_FILE"
done <"$INDEX_FILE"
mv -f "$TMP_FILE" "$FILE_TO_SORT"
上記のスクリプトは2つの引数を取り、最初の引数を2番目の引数に基づいて並べ替えます。インデックスファイルのいずれにも一致しない行は破棄され、元のファイルも並べ替えられたファイルに置き換えられることを考慮してください。さらに、同じインデックスで並べ替える行が複数あり、それも並べ替えたい場合は、grp行をこのgrep "$LINE" "$FILE_TO_SORT" | sort -f 4 >>"$TMP_FILE"
に変更すると、次の番号(フィールド4)で並べ替えられます。終わり。
ソートするハードコードされたファイル名と入力ファイルを変数で置き換えるだけの場合、これは機能します。input_file="$1"; file_to_sort="$2"; while read line ; do grep $line $file_to_sort ; done < $input_file
次に、../index.txtとfile_to_sort.txtを引数としてスクリプトに渡して実行します。
また、スクリプトで、file_to_sortにindex.txtのどの行とも一致しない行がある場合、それらは出力で省略されることに注意してください。