我的 awk 程序将空格更改为制表符不起作用

我的 awk 程序将空格更改为制表符不起作用

如何编写一个 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


对于这种简单的更改,您最好使用trsed

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

相关内容