如何拆分文本文件,使每个段落都是自己的文件?

如何拆分文本文件,使每个段落都是自己的文件?

我有一个很长的网址列表,我正在尝试制作一个 shell 脚本来将每个段落(以换行符分隔)分割成自己的文件。文件需要编号

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。我认为这与网址中的斜杠和其他有趣的字符有关。如何使 shell 不将特殊字符解释为特殊字符?或者我应该使用 awk 或直接在 vim 中编写脚本或其他什么?我只是不知道该怎么做。

我有点羞于问这么愚蠢的问题,但我已经为此苦苦挣扎了大约三天,但我无法弄清楚。我知道,我完全不擅长 shell 脚本编写,但出于某种原因,我很高兴能够学习正确使用计算机。所以,是的,我很感谢您能给我的任何帮助!

编辑:我的输入文件的开头如下所示。这会是一个问题吗?

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 

相关内容