c - 使用 bash 清理数据格式

标签 c database bash formatting string-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

但我正在努力解决如何修改每个“片段”数据的部分(从某种意义上说,通过使用“|”作为分隔符来索引每个部分)。

最好是用 C 编写一个程序,将每个数据 block 设置为一个数组然后使用它,还是使用 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 作为最终输出文件。

文件内容如下:

输入.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|

希望这能满足您的要求:)

关于c - 使用 bash 清理数据格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49326677/

相关文章:

c - 从服务器发送到客户端

c - 如何读取evbuffer并将其放入libevent中的字符串(char *)

MySql DB 设计 - 两者中哪一个是最好的 - 规范化与否

android - 无法读取数据库android

bash - 如何从 bash 中读取整行

c - 在 C 语言中,如何使用 printf() 函数将字符串设为 'store'?

c - clEnqueueNDRangeKernel 何时或为何将 Null 作为事件返回?

java - 用于在存储模式的给定列上匹配输入字符串的 SQL

bash - unix bash 命令

linux - Bash 循环遍历日期时间 +%Y-%m-%d %H :%M format