키워드 목록을 기준으로 파일 목록을 정렬하고 번호순으로 정렬

키워드 목록을 기준으로 파일 목록을 정렬하고 번호순으로 정렬

키워드 목록이 있습니다keywords.txt

cat & mouse
dog
mouse

파일에 있는 긴 이미지 파일 목록images.txt

8284,cat-mouse.jpg001
8286,cat-mouse.jpg003
8285,cat-mouse.jpg002
50,mouse.jpg004
52,mouse.jpg003
1000,dog.jpg003
1003,dog.jpg002
1002,dog.jpg001
51,mouse.jpg002
53,mouse.jpg001

아래와 같은 이미지 목록이 필요합니다.

8284,cat-mouse.jpg001
8285,cat-mouse.jpg002
8286,cat-mouse.jpg003
1000,dog.jpg001
1002,dog.jpg002
1003,dog.jpg003
50,mouse.jpg001
51,mouse.jpg002
52,mouse.jpg003
53,mouse.jpg004

각 키워드 앞의 이미지 번호는 ,올바른 숫자 순서여야 하고 jpgxyz 값은 001 등으로 시작해야 하지만 키워드 목록이 우선하므로 Tom and Jerry > Dog > Rat가 됩니다. 키워드 목록에는 이미지 파일이 좋아하지 않는 문자도 포함되어 있으며 & ! ,키워드가 유사할 수 있습니다. 예를 들어 다른 키워드가 dog2결합되지 않을 수 있습니다.

답변1

변환에 대한 @Freddy의 가정과 유사합니다.

OUTPUT=output.txt
IMAGES=images.txt
KEYS=keywords.txt

if [ -f $OUTPUT ]; then rm $OUTPUT; fi
while read KEY; do
    KEY=$(echo "$KEY" | sed -E -e 's/[)(&!,]/ /g ; s/ +/-/g')
    echo "key is ,$KEY."
    grep -Po "[0-9]+,$KEY\.jpg" $IMAGES | sort -k1 -n -t, | cat -n | while read  N F
    do
        echo $F$(printf "%03g" $N) | tee -a $OUTPUT
    done
    echo
done < $KEYS

생산하다

key is ,cat-mouse.
8284,cat-mouse.jpg001
8285,cat-mouse.jpg002
8286,cat-mouse.jpg003

key is ,dog.
1000,dog.jpg001
1002,dog.jpg002
1003,dog.jpg003

key is ,mouse.
50,mouse.jpg001
51,mouse.jpg002
52,mouse.jpg003
53,mouse.jpg004
500,mouse.jpg005

STDOUT으로 변환하지만 빈 줄과 키는 출력 파일에 기록되지 않습니다.

마지막으로 sort -k1 -n -t,각 키의 출력을 숫자로 정렬하여

500,mouse.jpg001
50,mouse.jpg002
51,mouse.jpg003
52,mouse.jpg004
53,mouse.jpg005

편집하다

images.txt실행하려면 및 가 포함된 디렉터리에 열려 있는 터미널에 코드를 복사하여 붙여넣습니다 keywords.txt. 출력은 에 기록됩니다 output.txt. 필요에 따라 이 이름을 변경하십시오.

그렇지 않으면 텍스트 파일에 복사하여 파일이 있는 위치에 저장하고 실행 가능하게 만든 다음( chmod +x whateverYouCalledIt) 명령줄에서 다음을 입력하여 액세스할 수 있습니다../whateverYouCalledIt

위와 동일한 작업을 수행하고 $PATH 디렉터리에 저장하면 어디서나 실행할 수 있습니다.whateverYouCalledIt

좋다이것

()교체할 문자 목록에도 추가되었습니다 .-

답변2

키워드 변환에 대한 가정은 다음과 같습니다.

  • &, !,빈 문자열로 바꾸기
  • 공백 문자를 다음으로 바꾸십시오.-
  • -여러 개를 하나로 교체-

sed그에 따라 교체를 수정 해야 합니다 .

#!/bin/bash

# read keywords linewise
while IFS= read -r keyword; do

        # replace '&', '!', ',' with empty string ''
        # replace ' ' with '-'
        # replace multiple '-' with one '-'
        kw=$(echo "$keyword" | sed 's/[&!,]//g; s/ /-/g; s/-\+/-/g')
        echo "keyword: \"$keyword\" -> \"$kw\""
        count=0

        # filter input file by keyword without jpg index and sort numeric
        while IFS= read -r line; do
                # write sorted lines with new jpg index
                printf '%s%.3d\n' "$line" $((++count)) >> images.txt.new
        done < <(grep -o '[0-9]\+,'"$kw"'\.jpg' images.txt | sort -n)

done < keywords.txt

노트:

  • 새 이미지 목록의 출력이 에 추가됩니다 images.txt.new. 다음 실행 전에 이 파일을 삭제해야 합니다.
  • 일치하지 않는 키워드/잘못된 키워드 변환으로 인해 출력이 손실되거나 잘못된 결과가 발생합니다.

출력(키워드 전환만 보기):

$ ./script.sh
keyword: "cat & mouse" -> "cat-mouse"
keyword: "dog" -> "dog"
keyword: "mouse" -> "mouse"

답변3

원한다면 몇 가지 의견을 추가할 수 있습니다.

첫 번째 방법 - 그냥 멍하니 바라보세요.

#!/bin/bash

gawk -F'[,.]' '

FNR == NR {
    gsub(/[&!, )(]+/, "-")
    keyword_arr[i++] = $0   
}

FNR != NR {
    image_arr[$2][$1]
}

END {
    PROCINFO["sorted_in"] = "@ind_num_asc"

    for(i in keyword_arr) {
        keyword = keyword_arr[i]
        jpg_cnt = 0
        for(image_num in image_arr[keyword]) {
            printf("%d,%s.jpg%03d\n", image_num, keyword, ++jpg_cnt)
        }
    }
}' keywords.txt images.txt

두 번째 방법 - 각 키워드에 대한 파일이 포함된 보조 디렉터리를 사용합니다.

#!/bin/bash

aux_dir='auxiliary_dir'

mkdir -p "$aux_dir"

gawk -F'[.,]' -v aux_dir="$aux_dir" '{
    print $1","$2 > aux_dir"/"$2
}' images.txt


sed -r 's/[!&, )(]+/-/' keywords.txt | while read keyword;
do
     sort -n "${aux_dir}/${keyword}" | gawk '{printf("%s.jpg%03d\n", $0, NR) }' 
done

# The 'echo' is added for safety while testing.
# The auxiliary directory is no longer needed, so can be removed
echo rm -r "${aux_dir}"

산출:

8284,cat-mouse.jpg001
8285,cat-mouse.jpg002
8286,cat-mouse.jpg003
1000,dog.jpg001
1002,dog.jpg002
1003,dog.jpg003
50,mouse.jpg001
51,mouse.jpg002
52,mouse.jpg003
53,mouse.jpg004

관련 정보