如何编写一个 shell 脚本,用于awk
读取数据文件students.txt
并以选项卡格式输出数据,如下所示:
Surname Forename MSc Stream Date of Birth
Smith John IT 15.01.1986
Taylor Susan IT 04.05.1987
Thomas Steve MIT 19.04.1986
如果选项卡式列未对齐,请不要担心。
每一列(姓氏、名字、理学硕士学位和出生日期)之间的距离为一个制表符。
问题:
为什么下面的代码对我不起作用?
awk 'BEGIN {IFS=" "} {OFS="\t"} {print $1,$2,$3,$4}' students.txt
答案1
awk '{$1=$1}1' OFS="\t" students.txt
概念验证
$ awk '{$1=$1}1' OFS="\t" students.txt
Surname Forename MSc Stream Date of Birth
Smith John IT 15.01.1986
Taylor Susan IT 04.05.1987
Thomas Steve MIT 19.04.1986
解释
它不起作用的原因是因为awk
在应用新的输出字段分隔符之前需要更改其中一个字段。此缺陷的解决方法(恕我直言)是仅将一个字段设置为其自身,因此$1=$1
对于这种简单的更改,您最好使用tr
或sed
tr -s ' \t' '\t*' < students.txt
sed 's/[[:space:]]\+/\t/g' students.txt
答案2
这是错误的:
awk 'BEGIN {IFS=" "} {OFS="\t"} {print $1,$2,$3,$4}' students.txt
因为你设置 OFS 太晚了(不在 BEGIN 块中)。做这个:
awk 'BEGIN {OFS="\t"} {print $1,$2,$3,$4}' students.txt
不要忘记将标题更改为具有 4 个空格分隔的字段:
Surname Forename MSc_Stream Date_of_Birth