需要制作一个shell脚本来拆分每个使用n
作为分隔符的csv文件,每个文件的限制是单词数和我不能把线切成两半。
在向导的帮助下完成了脚本
示例:
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}
- 如果计数器弹出超过1000,则将其发送回0,并将
filenumber
变量增加1counter>1000{counter=0;++filenumber}
最小化一点:
awk -F" " 'BEGIN{fn=1}{c+=NF}{print $0>FILENAME"_part_"fn}c>1000{c=0;++fn}' yourinputfile