获取文件中单词编号X的行数



需要制作一个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是:

  1. 用空间-F" "分割每一行
  2. 在处理文件之前,将filenumber变量设置为1
  3. 按行{counter+=NF}中的字段数凹凸计数器变量
  4. 打印出文件的行,用变量编号。在此处使用FILENAME内置变量来拉动yourinputfile{print $0 > FILENAME"_part_"filenumber}
  5. 如果计数器弹出超过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

最新更新