bash - 如何在使用 shell 脚本编写时通过修改将数据从一个文本文件写入另一个文本文件
问题描述
我有一个包含数据的文件 Sample_20210805_009.txt 文件-
ID|Date|Marks|Age|Status|ContactNo
1|11:25:08|56.76|22|Pass|8787
所以我想开发一个脚本run.sh,它将创建一个名为“output.20210805.class.txt”的输出文件(所以输出文件的名称应该取自示例文件的日期,即Sample_20210805_009.txt - “20210805” .并且该文件中的输出应该是-
NAME SET <GAIN A> D5.MARKS[05AUG2021] = 56.76
NAME SET <GAIN A> D5.AGE[05AUG2021] = 22
NAME SET <GAIN A> D5.STATUS[05AUG2021] = PASS
NAME SET <GAIN A> D5.CONTACTNO[05AUG2021] = 8787
NAME SET <GAIN A> D5.CLASS[05AUG2021] = "10"
在这个输出文件的最后一行和内容到 D5。会一样。此外,每个对象之后生成的日期应该是根据给定的文件名自动生成的,即 20210805,因此日期是 [05AUG2021]。有人可以帮忙吗?
解决方案
如果ed
在 shell 和一些 Linux/Unix 实用程序的帮助下可用/可接受。
#!/bin/sh
file=Sample_20210805_009.txt
temp=${file%_*}
last_entry='CLASS "10"'
date_to_convert=${temp#*_}
converted_date=$(date -d"$date_to_convert" '+%d%b%Y')
ed -s "$file" <<EOF
H
%s/^[^|]*|[^|]*|//
w tmpa
%d
0a
$last_entry
.
0r !tr '|' '\n' < tmpa | tr '[:lower:]' '[:upper:]' | pr -t2s' '
%s/^\(.*\) \(.*\)/NAME SET <GAIN A> D5\.\1[$converted_date] = \2/
%p
!rm tmpa
Q
EOF
应该显示一些错误消息,而
H
不仅仅是一个简单的?
是否以及何时ed
应该遇到错误。GNU
date
(1) 用于转换日期格式。tmpa
它会在写入的行创建一个名为的临时文件,该文件w tmpa
也会在写入的行被删除!rm tmpa
。如果需要就地编辑,请更改
Q
为。w
要将结果/输出保存在新文件中,请更改
Q
为w output.txt
或 根据您的情况w output.$converted_date.class.txt
删除位于的行
%p
以使输出静音。如果
tmpa
由于某种原因不够好,请参阅如何以安全的方式创建临时文件?
推荐阅读
- r - 有没有办法在具有相同分类 X 变量的同一个图中绘制多个分类 Y 变量?
- ios - SwiftUI:拖动逻辑错误还是这是一个错误?
- angular - 如何在 stackblitz 中设置带角度的玩笑
- python - 尝试创建csv文件时python3中的ascii编码问题
- javascript - 带有搜索过滤器的 Vue.js 嵌套 for 循环
- unicode - 在 Windows 10 cmd 中显示 unicode 字符
- visual-studio - TFS/C#:在构建过程中记录自定义警告
- php - 为什么 laravel push 给我一个错误 1364:字段 'question_entity_id' 没有默认值?
- sql - 一组结果中的sql分组
- javascript - 如何使用 Xpath 从嵌套表中获取行数?