我正在尝试解决我的一项旧任务,我确实陷入了这一困境,有人可以帮我吗?
有一个名为“数据文件”的文件。该文件包含一些朋友的名字和他们的
年龄。但不幸的是,名称的格式不正确。他们应该是
姓,名
但是,由于错误,他们是名字,姓氏
问题的任务是编写一个名为fix_datafile的shell脚本。
更正问题,然后按字母顺序对名称进行排序。更正的文件名
被称为datafile.fix。
请确保保持文件的原始结构不变。
以下是datafile.fix文件的示例:
#个人信息
#******** 姓名年龄 *****
亚历山大·富兰克林47
克里斯汀·琥珀54
苹果酥(Franky 33)
阿塔博瓦尔,阿曼18
巴拉德,乔治38
山姆巴拉德19
香醋,雪利酒22
鲍勃·史蒂文(Steven)33
钱特尔,亚历克斯60
道尔·杰弗里45
Farland,帕梅拉40
杂工,吉米23
詹妮弗·卡什曼25
卡伦,艾伦33
罗伦·艾伦29
麦蒂斯(Johny)26
杰弗里·麦克斯特31
格里沙牛顿40
富兰克林乌萨马33
欧萨娜·加百列61
奥克斯纳德,乔治20
法兰克帕洛玛24
苏珊·普洛默29
约翰·普兰克31
罗切斯特,本杰米40
Stanock,维罗纳38
特内西克,加百利29
威尔士,艾尔莎(Elsa)21
如果可以使用awk
(我想可以),那么可以使用一个脚本来满足你的需要:
#!/bin/bash
RESULT_FILE_NAME="datafile.new"
cat datafile.fix | head -4 > datafile.new
cat datafile.fix | tail -n +5 | awk -F"[, ]" '{if(!$2){print()}else{print($2","$1, $3)}}' >> datafile.new
传递-F"[, ]"
允许awk
按,和空格分割列,而剩下的只是按所需格式打印的列。缺点是我们应该使用if
语句来保留空行,并且文件头也应该分开处理。
另一种选择是使用sed
:
cat datafile.fix | sed -E 's/([a-zA-Z]+),([a-zA-Z]+) ([0-9]+)/\2,\1 \3/g' > datafile.new
缺点是它需要的正则表达式不像awk
语法那么明显。
sed可以做什么?
会有类似的表达
awk
,但使用sed
。它只是另一个测试处理器,并没有什么大不同刚刚使用添加了一个解决方案
sed
。由于保留了文件结构,因此效果更好使用awk时不需要猫和头,因为awk可以为您完成所有这些处理。