非常に長いURLのリストがあり、各段落(改行で区切られた)を独自のファイルに分割するシェルスクリプトを作成しようとしています。ファイルに番号が必要です。
001 002 003 ...
など。私が試したことは次のとおりです。
#!/bin/zsh
# Jakaa pitkä tiedoston kappaleet erilisiin tiedostoihin
# Ei toimi.
i=1
while read p; do
if [[ "$p" == "k" ]]; then
i=$((i + 1))
continue
fi
if (( $i < 10 )); then
printf '%s\n' "$p" | tee -a kuvat_vol00"$i"
elif (( $i > 9 )) && (( $i < 100 )); then
printf '%s\n' "$p" | tee -a kuvat_vol0"$i"
elif (( $i > 99 )); then
printf '%s\n' "$p" | tee -a kuvat_vol"$i"
fi
done
私は改行文字を区切り文字として使用する方法を知らなかったので、文字「k」を代わりに使用しました。おそらく馬鹿かもしれません、私も知っています...
このスクリプトは、次のように作成されたテストファイルで動作します。
123
k
123
k
sdfsdf
k
k
something
これは私に与えるクワット_001そしてクワット_002そして「123」そしてクワット_003そして「sdfsdf」など。ただし、URLを使用しようとすると、すべてのコンテンツがファイルとして印刷されます。クワット_001。私はこれがURLのスラッシュやその他の興味深い文字に関連していると思います。シェルが特殊文字を特殊文字として解釈しないようにするには?それとも、vimなどで直接awkまたはscriptを使用する必要がありますか?私は何をすべきかわかりません。
こんな愚かな質問をするのがちょっと恥ずかしいですが、この問題で3日ほど相談しましたが、まったく理解できません。私はシェルスクリプトに全くうまくいかないことを知っています。しかし、何らかの理由でコンピュータを正しく使用する方法を学ぶことができてうれしいです。はい、助けてくれてありがとう!
編集:私の入力ファイルの先頭は次のとおりです。これが問題になる可能性がありますか?
https://2.bp.blogspot.com/l3Sk4TIKuKgEji-IJbxA7LetcDqWGbosjx-wSH8omLyNj4b1hq-Cs1wtFxd88XASw-FiJjjFSNbO=s1600
https://2.bp.blogspot.com/9GUUQ1HaC6m-4LbMKOZ7JLj55SqMfam9SHD6J48ezjGNY_hy8YUYYybhip_LKgYr9pKEI140Ewug=s1600
https://2.bp.blogspot.com/LYVJuq-I5kmAQUfLd_Kk28rJu1sOdo3md0ANHgS5w_wIVSIHSrwJAgO_MNm9DFg7GahrSYo4MFIp=s1600
https://2.bp.blogspot.com/qBITOIAnC09jmA-KDrFRyD3yGK_-2kNRyfr-AAJlitKTR8R7qzy8Q6v_1ukwZVBmIT8hBSRyinJE=s1600
https://2.bp.blogspot.com/9dwLT4h1pDRoOf0Mmp76zy04UGzPVEVTChNdTHAfqDPsb5fSSB2Tf4hFlFivNqPgplwKvdoEYNR0=s1600
https://2.bp.blogspot.com/D-9yBu7Zzg65mnfO2DuyU4aBcF9kAgllCJPpFuRKDrN5qUiuwJ9U-ReMhBg8b0Grg4PdcHlcmh2Y=s1600
https://2.bp.blogspot.com/RAUJka1fyc5yQAwh_O9bmqKj0vXgFvM9QvuIcKkItkxQiNFGgU1WUSBNqUQIGnnNpZaSzPHCyd8N=s1600
答え1
これはさまざまなツールを使用して実行できます。段落の概念があるので、awkを使いましょう。
awk '
BEGIN { RS="" }
{ F=sprintf("kuvat_%03d", NR) ; print > F ; close(F) }' input_file_name
短絡モードを有効にするには、RS変数を空の文字列に設定します。各履歴(段落)に対して正しい名前のファイルで印刷し、ファイルを閉じます。
答え2
現実的なGNU csplit
:
$ csplit \
--suppress-matched -s \
-f kuvat_vol_ -b %03d \
file '/^$/' '{*}' \
;
使用Perl
:
$ perl -l -00pe '
close F if $i;
open F, ">", sprintf "kuvat_vol_%03d", $i++;
select F;
' file