Warm tip: This article is reproduced from serverfault.com, please click

bash-如何编写一个Shell脚本来交换txt文件中的列?

(bash - How to write a shell script to swap columns in txt file?)

发布于 2020-11-28 13:14:25

我正在尝试解决我的一项旧任务,我确实陷入了这一困境,有人可以帮我吗?

有一个名为“数据文件”的文件。该文件包含一些朋友的名字和他们的

年龄。但不幸的是,名称的格式不正确。他们应该是

姓,名

但是,由于错误,他们是名字,姓氏

问题的任务是编写一个名为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

Questioner
kjbjjknjkbasjx
Viewed
11
Taras Khalymon 2020-11-28 22:04:01

如果可以使用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语法那么明显