я пытался разбить файл на части по n совпадений. Файл состоит из одной строки, а разделитель - '<br>'

foo<br>bar<br>.....<br>

Я просто хочу разбить файл на части, где каждый файл имеет 100 наборов данных ( text plus <br>)(обычно 100 наборов данных, но в конце может быть меньше)

Я уже поигрался с этим ... split-file-in-2-with-sed и этим " split-one-file-as-to-many-files-based-on-pattern"

sed.exe -e "^.*.<br>{0,100}/g" < original.txt > first_half.txt

Разделение не работает, и в результате получается только 1 файл вместо многих.

2 ответа2

0
awk -v n=100 -v RS="<br>" -v ORS="<br>" '++i % n == 0 {printf "\n"} 1' file

Тестовое задание

$ printf "%d<br>" $(seq 100)
1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>70<br>71<br>72<br>73<br>74<br>75<br>76<br>77<br>78<br>79<br>80<br>81<br>82<br>83<br>84<br>85<br>86<br>87<br>88<br>89<br>90<br>91<br>92<br>93<br>94<br>95<br>96<br>97<br>98<br>99<br>100<br>

$ printf "%d<br>" $(seq 100) |
  awk -v n=10 -v RS="<br>" -v ORS="<br>" '++i % n == 0 {printf "\n"} 1'
1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>
10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>
20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>
30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>
40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>
50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>
60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>
70<br>71<br>72<br>73<br>74<br>75<br>76<br>77<br>78<br>79<br>
80<br>81<br>82<br>83<br>84<br>85<br>86<br>87<br>88<br>89<br>
90<br>91<br>92<br>93<br>94<br>95<br>96<br>97<br>98<br>99<br>
100<br>
0

Я получаю неизвестную команду с помощью sed на моей машине RHEL. Вероятно, потому что вы используете Windows и sed.exe занимает ^.*.<br>{0,100} как шаблон для команды g.

echo "foo<br>bar<br>...baz<br>" |  sed -e "^.*.<br>{0,100}/g"
sed: -e expression #1, char 1: unknown command: `^'

Вы пытаетесь поместить каждый матч в образец пространства. Я думаю, что этот подход не сработает, потому что сопоставление типа sed "/pattern/command" будет выполняться только один раз на строку, так что всего в вашем случае. И даже если текст разделен по-другому, вы перенаправляете вывод в один файл.

Вот более простой подход, чтобы заменить все вхождения
:

echo "foo<br>bar<br>...baz<br>" |  sed -e "s/<br>\{1,100\}/\n/g"
foo
bar
...baz

Затем вы можете использовать split, чтобы каждая строка была в другом файле.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .