Linux 请解释将固定宽度设置为CSV的awk脚本

Linux 请解释将固定宽度设置为CSV的awk脚本,linux,bash,csv,awk,command-line,Linux,Bash,Csv,Awk,Command Line,我在学一些awk。我在网上找到了一个将固定宽度的文件转换成csv文件的例子。尽管阅读了许多手册页和在线教程,但有一部分我还是不明白: 1: awk -v FIELDWIDTHS='1 10 4 2 2' -v OFS=',' ' 2: { $1=$1 ""; print } 3: ' data.txt` 这是在线示例()中的逐字记录 我不明白的是第2行。我知道没有条件,所以“程序”(包含在括号中)将始终按每条记录(行)执行。我不明白它为什么要执行$1=$1以及空字符串语句”。但是,删除这

我在学一些awk。我在网上找到了一个将固定宽度的文件转换成csv文件的例子。尽管阅读了许多手册页和在线教程,但有一部分我还是不明白:

1: awk -v FIELDWIDTHS='1 10 4 2 2' -v OFS=',' '
2:    { $1=$1 ""; print }
3: ' data.txt`
这是在线示例()中的逐字记录


我不明白的是第2行。我知道没有条件,所以“程序”(包含在括号中)将始终按每条记录(行)执行。我不明白它为什么要执行
$1=$1
以及空字符串语句
。但是,删除这些会导致不正确的行为。

$1=$1
为$1指定一个值(恰好是它已经具有的相同值)。将任何值赋给字段会导致awk使用字段之间的OFS值重新编译当前记录(有效地将所有FSs或FIELDSEPS间隔替换为OFSs)


是因为编写脚本的人并不完全理解awk,并且认为有必要通过在赋值之前将数字转换为字符串来确保数字保持其精度。

这一行最好写成
{$1=$1}1
这只是强制改变记录结构,以便
awk
使用
OFS
作为commaThanks@anubhava重写每一行。当我运行
{$1=$1;print}
时,它会工作!您关于更改记录结构以导致重写的评论是关键!如果你想写一个答案,我会投你的票。而且,有了这些信息,我能够找到一个相关的SO问题,并提供一些额外的有用信息:谢谢Ed Morton!这也是一个很好的提醒,关于以下来自互联网博客帖子的建议…:)
$ echo 'a,b,c' | awk -F, -v OFS="-" '{print; $1=$1; print}'
a,b,c
a-b-c