Необходимо создать сценарий оболочки, который разбивает каждый файл 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
Думаю, с awk
с этим было бы намного проще справиться:
awk -F" " 'BEGIN{filenumber=1}{counter+=NF}{print $0 > FILENAME"_part_"filenumber} counter>1000{counter=0;++filenumber}' yourinputfile
awk
вот это:
-F" "
filenumber
значение 1{counter+=NF}
FILENAME
для протягивания через yourinputfile
. {print $0 > FILENAME"_part_"filenumber}
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 доллара, большое спасибо. Сначала я выучу его шаг за шагом, а потом черт возьми из него хаха
Не стоит беспокоиться. awk
- довольно мощная штука. Для развлечения просто запустите awk -F" " '{print $3}' yourfile.txt
. Вы увидите, что выводится третье слово каждой строки. Остальное довольно легко понять. И я определенно не волшебник. Я даже не настолько хорош в awk. Здесь есть несколько человек, которые, вероятно, качают головами из-за какого-то странного способа, которым я решил это в awk и могу переписать это примерно с 30 символами. Уму непостижимо.
Я только что понял, что здесь не хватает последней части файла. Необходимо добавить блок END {}. Обновление входящих.
OK. Обновлено с учетом последнего блока END {}.
Попробуйте использовать echo "Five spaces between a b"
в качестве входных данных. Может быть, не то, что хочет OP.
Привет, снова в офисе, извините за задержку, в пятницу свет погас на 4 часа. Получение ошибки с именем файла _part_. Пытался обменять его на "FILENAME _part_"
Также этот awk обрезает строку в середине предложения. каждые 1000 слов следует обрезать после окончания строки. Вот почему мне нужен номер строки на каждые 1000 слов, а не просто разрезать его посередине
Ой! Стрелять. awk
здесь по-прежнему хороший выбор. Просто нужно немного потеснить это.
Сделал это работать с sv = FILENAME "часть" int (counter / 1000); буфер печати> sv; чтобы обойти комбо variable_string_int. Теперь пытаемся заставить его закончить строку при буферизации.
На самом деле это значительно упрощает задачу, поскольку нам не нужно возиться с циклом for: awk -F" " 'BEGIN{filenumber=1}{counter+=NF}{print $0 > FILENAME"_part_"filenumber} counter>1000{counter=0;++filenumber}' yourinputfile
Я обновил ответ, делая это построчно, а не слово за словом.
ИДЕАЛЬНО! , боже, ха-ха, мне нужно научиться делать это самому (новая работа, выход из моей глубины), теперь просто создам какой-то sh, который вызывает этот параллелизм для каждого файла в папке и выводит каждую часть в подпапку, и я закончу свою работу. СПАСИБО за помощь @JNevill ты святой
Вы также можете отправить несколько файлов в awk, указав их за командой. Настраивая, как мы увеличиваем / сбрасываем эту переменную filenumber
, вы, вероятно, могли бы просто сделать все это там. При этом я думаю, что было бы на 100% разумным сделать цикл файлов и в bash. Это сделало бы команду awk
красивой, маленькой и простой в отладке.
моему другу нужна последняя помощь, скрипт творит чудеса, он сделал так, что он соединяет каждый csv в папке с подпапкой. Единственное, что когда в имени файла есть пробел, awk сообщает, что не может открыть файл. Обновлен исходный пост с кодом
Добро пожаловать в SO. Stack Overflow - это сайт вопросов и ответов для профессиональных программистов и энтузиастов. Цель состоит в том, чтобы вы добавили к своему вопросу некоторый собственный код, чтобы показать, по крайней мере, исследовательские усилия, которые вы предприняли, чтобы решить эту проблему самостоятельно.