使用 bash 清理数据格式
Using bash to clean up data formatting
我是 bash 脚本编写的新手,需要一些关于我正在从事的项目的帮助。我正在尝试使用 bash shell 脚本将包含数据库数据的 .txt 文件编辑为更有用的格式。
当前数据格式如下(该文件有几千条这样的数据):
DATA:|11.00000|000563784644|7031450|7031450||1.000000|1.000000|0.000000|0.000000|0.000000|21.000000|47.040000|60.480000|0.000000|0.000000|0.000000|0.000000|0.000000|0.000000|1.000000|100.000000
我想从文件中的每条数据中删除 "DATA:" 前缀,添加适当的日期信息,并将部分数据重新格式化为以下最终格式:
2017/01/27|0011|000563784644|7031450|7031450||1|1|0|0.00|0.00|21|47.04|60.48|0|0|0|0 |0.00|0.00|1|100
我已经想出如何像这样遍历文件中的每条数据:
while read p; do
...
done <peptides.txt
但我正在为如何修改每个 'piece' 数据的部分而苦苦挣扎(在某种意义上,通过使用“|”作为分隔符来索引每个部分)。
最好是用 C 写一个程序,将每个数据块设置为一个数组然后使用它,还是使用 bash 命令编辑数据字符串?
您可以使用以下脚本来实现您的要求
while read line ; do
for i in `echo $line |sed "s/||/|empty|/g" | tr '|' '\n'`; do if [[ $i =~ [0-9] ]];then printf "%.2f\n" $i ; else printf "$i\n"; fi ; done | tr '\n' '|' | sed "s/\.00//g" | sed "s/DATA:/$(date +%F)/g" | tr '-' '\/' | sed "s/|empty|/||/g"; printf "\n"
done < input.txt > output.txt
我已经测试了脚本,并根据您的要求使用 input.txt
作为输入文件,并使用 output.txt
作为最终输出文件。
文件内容如下:
input.txt
cat input.txt
DATA:|11.00000|000563784644|7031450|7031450||1.000000|1.000000|0.000000|0.000000|0.000000|21.000000|47.040000|60.480000|0.000000|0.000000|0.000000|0.000000|0.000000|0.000000|1.000000|100.000000
DATA:|31.00000|0005784644|7031450|73333450||1.0340000|1.000000|0.03000|0.000000|0.020000|21.000000|47.040000|60.480000|0.000000|0.000000|0.000000|0.000000|0.000000|0.000000|1.000000|100.000000
DATA:|11.00000|000563784644|7031450|7031450||1.000000|1.000000|0.000000|0.000000|0.200000|21.000000|47.040000|60.480000|0.000000|0.000000|0.000000|0.000000|0.000000|0.000000|1.000000|100.000000
DATA:|11.00200|000563784644|7031450|7031420||1.010000|1.000000|0.000000|0.000000|0.000000|21.000000|47.040000|60.480000|0.000000|0.000000|0.000000|0.000000|0.000000|0.000000|1.000000|100.001000
output.txt
cat output.txt
2018/03/17|11|563784644|7031450|7031450||1|1|0|0|0|21|47.04|60.48|0|0|0|0|0|0|1|100|
2018/03/17|31|5784644|7031450|73333450||1.03|1|0.03|0|0.02|21|47.04|60.48|0|0|0|0|0|0|1|100|
2018/03/17|11|563784644|7031450|7031450||1|1|0|0|0.20|21|47.04|60.48|0|0|0|0|0|0|1|100|
2018/03/17|11|563784644|7031450|7031420||1.01|1|0|0|0|21|47.04|60.48|0|0|0|0|0|0|1|100|
希望这能满足您的要求:)
我是 bash 脚本编写的新手,需要一些关于我正在从事的项目的帮助。我正在尝试使用 bash shell 脚本将包含数据库数据的 .txt 文件编辑为更有用的格式。
当前数据格式如下(该文件有几千条这样的数据):
DATA:|11.00000|000563784644|7031450|7031450||1.000000|1.000000|0.000000|0.000000|0.000000|21.000000|47.040000|60.480000|0.000000|0.000000|0.000000|0.000000|0.000000|0.000000|1.000000|100.000000
我想从文件中的每条数据中删除 "DATA:" 前缀,添加适当的日期信息,并将部分数据重新格式化为以下最终格式:
2017/01/27|0011|000563784644|7031450|7031450||1|1|0|0.00|0.00|21|47.04|60.48|0|0|0|0 |0.00|0.00|1|100
我已经想出如何像这样遍历文件中的每条数据:
while read p; do
...
done <peptides.txt
但我正在为如何修改每个 'piece' 数据的部分而苦苦挣扎(在某种意义上,通过使用“|”作为分隔符来索引每个部分)。
最好是用 C 写一个程序,将每个数据块设置为一个数组然后使用它,还是使用 bash 命令编辑数据字符串?
您可以使用以下脚本来实现您的要求
while read line ; do
for i in `echo $line |sed "s/||/|empty|/g" | tr '|' '\n'`; do if [[ $i =~ [0-9] ]];then printf "%.2f\n" $i ; else printf "$i\n"; fi ; done | tr '\n' '|' | sed "s/\.00//g" | sed "s/DATA:/$(date +%F)/g" | tr '-' '\/' | sed "s/|empty|/||/g"; printf "\n"
done < input.txt > output.txt
我已经测试了脚本,并根据您的要求使用 input.txt
作为输入文件,并使用 output.txt
作为最终输出文件。
文件内容如下:
input.txt
cat input.txt
DATA:|11.00000|000563784644|7031450|7031450||1.000000|1.000000|0.000000|0.000000|0.000000|21.000000|47.040000|60.480000|0.000000|0.000000|0.000000|0.000000|0.000000|0.000000|1.000000|100.000000
DATA:|31.00000|0005784644|7031450|73333450||1.0340000|1.000000|0.03000|0.000000|0.020000|21.000000|47.040000|60.480000|0.000000|0.000000|0.000000|0.000000|0.000000|0.000000|1.000000|100.000000
DATA:|11.00000|000563784644|7031450|7031450||1.000000|1.000000|0.000000|0.000000|0.200000|21.000000|47.040000|60.480000|0.000000|0.000000|0.000000|0.000000|0.000000|0.000000|1.000000|100.000000
DATA:|11.00200|000563784644|7031450|7031420||1.010000|1.000000|0.000000|0.000000|0.000000|21.000000|47.040000|60.480000|0.000000|0.000000|0.000000|0.000000|0.000000|0.000000|1.000000|100.001000
output.txt
cat output.txt
2018/03/17|11|563784644|7031450|7031450||1|1|0|0|0|21|47.04|60.48|0|0|0|0|0|0|1|100|
2018/03/17|31|5784644|7031450|73333450||1.03|1|0.03|0|0.02|21|47.04|60.48|0|0|0|0|0|0|1|100|
2018/03/17|11|563784644|7031450|7031450||1|1|0|0|0.20|21|47.04|60.48|0|0|0|0|0|0|1|100|
2018/03/17|11|563784644|7031450|7031420||1.01|1|0|0|0|21|47.04|60.48|0|0|0|0|0|0|1|100|
希望这能满足您的要求:)