我正在 bash 中编写一个脚本来处理一些文本文件,也包含数字。我创建了一个数组变量,其中 45 个位置填充了数字。我有这个文本文件(分隔符实际上是“|”,而不是逗号),有 5 个字段/列和 45 行。我想添加第六列,并写下n每个数组的第一个值n文件的第 3 行。
我的原始文本文件,包含:
61537000|COO|DI|VMD|2018-01-08 00:00:00
61537000|COO|DI|VMD|2018-01-09 00:00:00
61537000|COO|DI|VMD|2018-01-10 00:00:00
61537000|COO|DI|VMD|2018-01-11 00:00:00
61537000|COO|DI|VMD|2018-01-12 00:00:00
...
61537000|COO|DI|VMD|2018-02-21 00:00:00
我的数组变量存储在qy
.echo ${qy[*]}
给我:
133.7545755174117347 197.5730453102068415 211.0612457141076671 195.3965252988823307 155.9141492798344956 122.0765862336716795 109.3807402580878840 100.1258594727256394 118.3713165600757955 129.9118732920391577 130.2183465952591614 108.3783455600275339 87.3744866455706415 74.6811189513075407 67.2786196847537834 66.6486466128231307 75.5263825809798786 79.7579752859345201 76.7748478701627372 75.7971233334776102 75.5218971041520397 74.3644957571369167 74.7302279790034398 82.9013111977886133 107.8462461297641418 109.3922469923296476 87.2584880672884534 74.3278359110118687 66.8273524401225775 62.9054376472748469 59.2471567250619217 55.4465232890134493 54.9324477319027615 55.0268189192084034 50.3969437024658000 48.2808157236208981 49.8788627643603767 50.7025436995365588 52.5391775713757207 51.6024683921895763 66.5341261816728136 73.3342955766798011 68.3585064456764055 69.1125302235501069 75.0594939607898664
所需的输出文件:
61537000|COO|DI|VMD|2018-01-08 00:00:00|133.75
61537000|COO|DI|VMD|2018-01-09 00:00:00|197.57
61537000|COO|DI|VMD|2018-01-10 00:00:00|211.06
61537000|COO|DI|VMD|2018-01-11 00:00:00|195.39
61537000|COO|DI|VMD|2018-01-12 00:00:00|155.91
...
61537000|COO|DI|VMD|2018-02-21 00:00:00|122.07
我已经成功地使用while read line do; ... done < file
了cut -d '|' -f6
读来自文件,但显然没有类似的while write
直接循环写里面有吗?任何帮助将非常感激。
答案1
纯bash
法。由于 中的元素数量$qy
与 中的行数相同文件,一个for
循环应该可以工作,使用read
里面循环:
for f in ${qy[*]}; do read x; printf '%s|%.2f\n' "$x" "$f"; done < file
如果由于某种原因printf
没有表现出来,可以用echo
和来完成参数替换:
for f in ${qy[*]}; do read x; echo "$x|${f%%??????????????}"; done < file
答案2
有很好的paste
:
printf '%.2f\n' "${qy[@]}" | paste -d'|' textfile -
61537000|COO|DI|VMD|2018-01-08 00:00:00|133.75
61537000|COO|DI|VMD|2018-01-09 00:00:00|197.57
61537000|COO|DI|VMD|2018-01-10 00:00:00|211.06
61537000|COO|DI|VMD|2018-01-11 00:00:00|195.40
61537000|COO|DI|VMD|2018-01-12 00:00:00|155.91
(为简洁起见,我只复制了前 5 个条目)。
答案3
步骤1
sed -r "s/\s+$//g" orgial_textfile| awk '{print $0"|"}' >>orginal_final_textfile
第2步
将数组变量保存在 need_copy_textfile 中
sample need_copy_textfile format will be
133.7545755174117347
197.5730453102068415
211.0612457141076671
195.3965252988823307
155.9141492798344956
122.0765862336716795
109.3807402580878840
100.1258594727256394
118.3713165600757955
129.9118732920391577
130.2183465952591614
108.3783455600275339
87.3744866455706415
.
.
.
75.0594939607898664
awk '{print substr($1,1,6)}' need_copy_textfile >> need_copy_textfile_final.txt
步骤3
现在结合以上两个文件以获得所需的结果
paste orginal_final_textfile need_copy_textfile_final.txt | sed -r "s/\t+//g"
样本输出
61537000|COO|DI|VMD|2018-01-08 00:00:00|133.75
61537000|COO|DI|VMD|2018-01-09 00:00:00|197.57
61537000|COO|DI|VMD|2018-01-10 00:00:00|211.06
61537000|COO|DI|VMD|2018-01-11 00:00:00|195.39
61537000|COO|DI|VMD|2018-01-12 00:00:00|155.91