1

如何将文件的行划分为其他文件

我本人不是程序员,而是开发了一个Shellscript来读取位置文件,并根据位置16指定的单个字母将所有行复制到另一个文件。

范例:

输入文件
003402841000011 A 10CNPJ08963394000195
003402841000041 B 20CNPJ08963394000195 16012020XX5313720087903007 003402841000011 A 10CNPJ08963394000195
003402841000041 B 20CNPJ08963394000195 16012020XX5313720087903007

输出文件A
003402841000011 A 10CNPJ08963394000195
003402841000011 A 10CNPJ08963394000195

输出文件B
003402841000041 B 20CNPJ08963394000195 16012020XX5313720087903007 003402841000041 B 20CNPJ08963394000195 16012020XX5313720087903007

我目前的代码有:

 #!/usr/bin/env bash ARQ_IN="$1"; DIR_OUT="C:/Users/etc/etc/"; while IFS= read -r line || [[ -n "$line" ]]; do SUBSTRING=$(echo $line| cut -c16); if [ $SUBSTRING == "A" ] then echo "$line" >> "$DIR_OUT"arqA.txt; else if [ $SUBSTRING == "B" ] then echo "$line" >> "$DIR_OUT"arqB.txt; else if [ $SUBSTRING == "K" ] then echo "$line" >> "$DIR_OUT"arqK.txt; else if [ $SUBSTRING == "1" ] then echo "$line" >> "$DIR_OUT"arq1.txt; else fi fi fi fi done < "$ARQ_IN"

尽管此代码有效,但它无法达到我所需要的速度,INPUT FILE具有大约40万个寄存器。

有人可以帮助我编写新代码或改进此代码吗?

已提交 December 02nd 2020 通過 Admin

答案
0

这是awk的工作,虽然我尚未使用庞大的数据集对其进行过测试,但您可以尝试遵循它吗?但是它绝对比OP当前的方法要快。要在输出文件名之前添加abosulte路径,我们可以将shell变量传递给awk变量,然后在此处将其获取到outputFile变量中。

 awk ' { close(outputFile) outputFile=("output_file_"substr($0,16,1)) print >> (outputFile) } ' Input_file

使用完整的文件夹路径来保存文件,请使用以下命令:

 DIR_OUT="/tmp/test/" awk -v folder="${DIR_OUT}" ' { close(outputFile) outputFile=(folder"arq"substr($0,16,1)".txt") print >> (outputFile) } ' Input_file

Admin | 10个月前



枪支相关

文本文件的单独列

November 26th 2020