Получить номер строки слова номер X в файле

Необходимо создать сценарий оболочки, который разбивает каждый файл CSV, который использует \n в качестве разделителя, ограничение на файл - это количество слов и Я не могу разрезать линию пополам.

Готовый скрипт с помощью мастера!

Пример:

sh SliceByWords.sh 1000 .   

Нарезает каждый файл на 1000 слов и помещает каждую часть в подпапку


        function has_number_number_of_words {
        re='^[0-9]+$'
        if ! [[ $1 =~ $re ]] ; then
            echo "error: Not a number, please run the command with the number of words per file" >&2; exit 1
        fi
    }
    #MAIN
    has_number_number_of_words $1
    declare -i WORDLIMIT=$1 # N of lines to part each file

    subdir = "Result"
    mkdir $subdir
    format=*.csv
    for name in $format; do mv "$name" "${name// /___}"; done
    for i in $format;
    do
     if [[ "$i" == "$format" ]]
     then
        echo "No Files"
     else
        ( locali=$(echo $i | awk '{gsub(/ /,"\\ ");print}');
            localword=$i;
            FILENAMEWITHOUTEXTENSION = "${localword%.*}" ;
            subnoext=$subdir"/"$FILENAMEWITHOUTEXTENSION;
            echo Processing file "$FILENAMEWITHOUTEXTENSION";
            awk  -v NOEXT=$subnoext -v wl=$WORDLIMIT  -F" " 'BEGIN{fn=1}{c+=NF}{sv=NOEXT"_snd_"fn".csv";print $0>sv;}c>wl{c=0;++fn;close(sv);}' $localword;

            )&


     fi
    done
    wait #wait
    for name in $format; do mv "$name" "${name//___/ }"; done
    echo All files done.

Поскольку я не мог понять, как вводить файлы awk с пробелами, я использовал

   for name in $format; do mv "$name" "${name//___/ }"; done

Добро пожаловать в SO. Stack Overflow - это сайт вопросов и ответов для профессиональных программистов и энтузиастов. Цель состоит в том, чтобы вы добавили к своему вопросу некоторый собственный код, чтобы показать, по крайней мере, исследовательские усилия, которые вы предприняли, чтобы решить эту проблему самостоятельно.

Cyrus 26.10.2018 20:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, с awk с этим было бы намного проще справиться:

awk -F" " 'BEGIN{filenumber=1}{counter+=NF}{print $0 > FILENAME"_part_"filenumber} counter>1000{counter=0;++filenumber}' yourinputfile

awk вот это:

  1. Разделение каждой строки пробелом -F" "
  2. Перед обработкой файла установите для переменной filenumber значение 1
  3. Увеличьте переменную счетчика на количество полей в строке {counter+=NF}
  4. Распечатайте строку файла, пронумерованную переменной. Здесь используется встроенная переменная FILENAME для протягивания через yourinputfile. {print $0 > FILENAME"_part_"filenumber}
  5. Если значение счетчика превышает 1000, верните его обратно в 0 и увеличьте переменную filenumber на 1 counter>1000{counter=0;++filenumber}.

Немного свернуто:

awk -F" " 'BEGIN{fn=1}{c+=NF}{print $0>FILENAME"_part_"fn}c>1000{c=0;++fn}' yourinputfile

УДИВИТЕЛЬНЫЙ! СВЯТОЙ ****! Вы какой-то волшебник ??? , серьезно, спасибо, это waaaay вне моего понимания, но awesome попытается сделать так, чтобы имя файла принималось на 1 доллар, а wordlimit на 2 доллара, большое спасибо. Сначала я выучу его шаг за шагом, а потом черт возьми из него хаха

Rodrigo Chapeta 26.10.2018 21:45

Не стоит беспокоиться. awk - довольно мощная штука. Для развлечения просто запустите awk -F" " '{print $3}' yourfile.txt. Вы увидите, что выводится третье слово каждой строки. Остальное довольно легко понять. И я определенно не волшебник. Я даже не настолько хорош в awk. Здесь есть несколько человек, которые, вероятно, качают головами из-за какого-то странного способа, которым я решил это в awk и могу переписать это примерно с 30 символами. Уму непостижимо.

JNevill 26.10.2018 21:46

Я только что понял, что здесь не хватает последней части файла. Необходимо добавить блок END {}. Обновление входящих.

JNevill 26.10.2018 21:50

OK. Обновлено с учетом последнего блока END {}.

JNevill 26.10.2018 21:56

Попробуйте использовать echo "Five spaces between a b" в качестве входных данных. Может быть, не то, что хочет OP.

Walter A 27.10.2018 00:07

Привет, снова в офисе, извините за задержку, в пятницу свет погас на 4 часа. Получение ошибки с именем файла _part_. Пытался обменять его на "FILENAME _part_"

Rodrigo Chapeta 29.10.2018 14:53

Также этот awk обрезает строку в середине предложения. каждые 1000 слов следует обрезать после окончания строки. Вот почему мне нужен номер строки на каждые 1000 слов, а не просто разрезать его посередине

Rodrigo Chapeta 29.10.2018 15:05

Ой! Стрелять. awk здесь по-прежнему хороший выбор. Просто нужно немного потеснить это.

JNevill 29.10.2018 15:06

Сделал это работать с sv = FILENAME "часть" int (counter / 1000); буфер печати> sv; чтобы обойти комбо variable_string_int. Теперь пытаемся заставить его закончить строку при буферизации.

Rodrigo Chapeta 29.10.2018 15:18

На самом деле это значительно упрощает задачу, поскольку нам не нужно возиться с циклом for: awk -F" " 'BEGIN{filenumber=1}{counter+=NF}{print $0 > FILENAME"_part_"filenumber} counter>1000{counter=0;++filenumber}' yourinputfile

JNevill 29.10.2018 15:22

Я обновил ответ, делая это построчно, а не слово за словом.

JNevill 29.10.2018 15:24

ИДЕАЛЬНО! , боже, ха-ха, мне нужно научиться делать это самому (новая работа, выход из моей глубины), теперь просто создам какой-то sh, который вызывает этот параллелизм для каждого файла в папке и выводит каждую часть в подпапку, и я закончу свою работу. СПАСИБО за помощь @JNevill ты святой

Rodrigo Chapeta 29.10.2018 15:30

Вы также можете отправить несколько файлов в awk, указав их за командой. Настраивая, как мы увеличиваем / сбрасываем эту переменную filenumber, вы, вероятно, могли бы просто сделать все это там. При этом я думаю, что было бы на 100% разумным сделать цикл файлов и в bash. Это сделало бы команду awk красивой, маленькой и простой в отладке.

JNevill 29.10.2018 15:36

моему другу нужна последняя помощь, скрипт творит чудеса, он сделал так, что он соединяет каждый csv в папке с подпапкой. Единственное, что когда в имени файла есть пробел, awk сообщает, что не может открыть файл. Обновлен исходный пост с кодом

Rodrigo Chapeta 30.10.2018 14:26

Другие вопросы по теме