キーワードリストがあります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
キーワード変換の前提は次のとおりです。
&
、!
および,
空の文字列に置き換える- 空白文字を次に置き換えます。
-
-
複数を1つに交換-
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
2番目の方法 - 各キーワードのファイルを含むセカンダリディレクトリを使用します。
#!/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