키워드 목록이 있습니다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