Сортировка одного файла по строке на основе другого файла

Я пытаюсь сортировать строки текстового файла на основе «индекса» в другом файле, так что текстовый файл упорядочен по строкам в том же порядке, что и индексный файл.

Следующий код достигает того, что я хочу сделать, но я хочу заменить file_to_sort.txt другой переменной (так что я могу передать два аргумента командной строки), чтобы сделать это общим скриптом. Я не могу понять, как сделать сделку 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 

Я уверен, что это действительно просто, но я не вижу его, и все, что я искал, чтобы попытаться решить это, не перетаскивало правильные ответы (так как я уверен, что на это где-то был дан ответ .

2 Solutions collect form web for “Сортировка одного файла по строке на основе другого файла”

 #!/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" 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 input_file="$1"; file_to_sort="$2"; while read line ; do grep $line $file_to_sort ; done < $input_file Затем 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, они будут опущены на выходе.

  • Как разбить файл на основе информации в столбце в Linux
  • Диапазон значений grep (/ sed / awk)
  • grep -f patternfile не находит ничего или слишком сильно в зависимости от содержимого шаблона
  • Объединение двух частей вместе для создания единого сценария
  • Как «grep» для длины строки * not * в заданном диапазоне?
  • egrep regular expression - одно и то же слово в начале и в конце
  • Частично удалить форматирование из текста в буфер обмена
  • Sed для удаления между разделителями, но сохранить первый разделитель
  • инструменты редактирования потока: вывод, что очищается
  • wget on Centos 7 Terminal как загрузить только текст без кода стиля сайта
  • Разделение строки до определенного места
  • Linux и Unix - лучшая ОС в мире.