根据一个文件逐行对另一个文件进行排序

根据一个文件逐行对另一个文件进行排序

我试图根据另一个文件中的“索引”对文本文件的行进行排序,以便文本文件按照与索引文件相同的顺序逐行排列。

以下代码实现了我想要做的事情,但我想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_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

我确信这真的很简单,但我看不到它,无论我正在寻找什么来尝试解决这个问题,都不会拖出正确的答案(因为我确信这已经得到了回答)某处。

答案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 个参数,并根据第二个参数对第一个参数进行排序,考虑到与索引文件中任何不匹配的行将被丢弃,原始文件也将被排序后的文件替换。最重要的是,如果您有几行要使用相同的索引进行排序,并且希望对其进行排序,您可以将 grp 行更改为此grep "$LINE" "$FILE_TO_SORT" | sort -f 4 >>"$TMP_FILE",它将按末尾的数字(字段 4)排序。

答案2

如果您想要做的只是用变量替换要排序的硬编码文件名和输入文件,那么这将起作用: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 中的任何行都不匹配,则这些行将在输出中被省略。

相关内容