Classificando um arquivo linha por linha com base em outro arquivo

3

Estou tentando classificar as linhas de um arquivo de texto com base em um "índice" em outro arquivo, de modo que o arquivo de texto seja organizado, linha por linha, na mesma ordem do arquivo de índice.

O código a seguir alcança o que eu quero fazer, mas eu quero substituir file_to_sort.txt por outra variável (para que eu possa passar 2 argumentos de linha de comando) para fazer deste um script geral. Eu não consigo descobrir como fazer o loop while lidar com isso.

while read line ; do grep $line file_to_sort.txt ; done < ../index.txt

O arquivo a ser classificado é o seguinte:

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

E a ordem do índice tem esta aparência (e, portanto, a saída deve ser o primeiro arquivo, classificada de acordo com as strings ./xxx_xxxx no segundo).

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

Tenho certeza de que isso é muito simples, mas não consigo enxergar e o que quer que eu esteja procurando para tentar resolver isso não está respondendo corretamente (já que tenho certeza de que isso foi respondido em algum lugar.

    
por Joe Healey 06.04.2016 / 10:26

2 respostas

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"

O script acima terá 2 argumentos e classificará o primeiro com base no segundo, leve em consideração que as linhas não correspondidas por qualquer no arquivo de índice serão descartadas, também o arquivo original será substituído pelo arquivo classificado. Além disso, se você tiver várias linhas para serem classificadas com o mesmo índice e quiser que sejam classificadas, você pode alterar a linha grp para este grep "$LINE" "$FILE_TO_SORT" | sort -f 4 >>"$TMP_FILE" e ele será classificado pelo número (campo 4) no final. .

    
por 07.04.2016 / 02:17
0

se tudo o que você quer fazer é substituir o nome do arquivo codificado a ser ordenado e o arquivo de entrada por variáveis, isso funcionará: input_file="$1"; file_to_sort="$2"; while read line ; do grep $line $file_to_sort ; done < $input_file , execute-o passando ../index.txt e file_to_sort.txt como argumentos para o script.

também, note que no seu script, se houver linhas no file_to_sort que não combinem com nenhuma linha no index.txt, elas serão omitidas na saída.

    
por 06.04.2016 / 11:00