Получить номер строки слова номер X в файле - PullRequest
0 голосов
/ 26 октября 2018

Необходимо создать сценарий оболочки, который разбивает каждый 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

1 Ответ

0 голосов
/ 26 октября 2018

Я думаю, что это было бы намного проще с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...