![다른 파일을 기준으로 한 파일을 한 줄씩 정렬합니다.](https://linux55.com/image/87059/%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C%20%ED%95%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%ED%95%9C%20%EC%A4%84%EC%94%A9%20%EC%A0%95%EB%A0%AC%ED%95%A9%EB%8B%88%EB%8B%A4..png)
텍스트 파일이 인덱스 파일과 동일한 순서로 한 줄씩 표시되도록 다른 파일의 "색인"을 기반으로 텍스트 파일의 줄을 정렬하려고 합니다.
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의 줄과 일치하지 않는 경우 해당 줄은 출력에서 생략됩니다.