首页 > 解决方案 > 如何在使用 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]。有人可以帮忙吗?

标签: bashshell

解决方案


如果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

  • 要将结果/输出保存在新文件中,请更改Qw output.txt或 根据您的情况w output.$converted_date.class.txt

  • 删除位于的行%p以使输出静音。

  • 如果tmpa由于某种原因不够好,请参阅如何以安全的方式创建临时文件?


推荐阅读