他のファイルに基づいてファイルを1行ずつ並べ替えます。

他のファイルに基づいてファイルを1行ずつ並べ替えます。

テキストファイルがインデックスファイルと同じ順序で1行ずつ表示されるように、他のファイルの「インデックス」に基づいてテキストファイルの行を並べ替えようとしています。

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

インデックス付けの順序は次のとおりです(したがって、出力は./xxx_xxxx2番目のファイルの文字列に基づいてソートされた最初のファイルでなければなりません)。

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

私はこれが本当に簡単であると確信していますが、それを見ることはできません。どこかに。

ベストアンサー1

#!/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)に基づいて並べ替えられることです。

おすすめ記事