我有一个文件marks.txt
,看起来像这样,用空格分隔。
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
我想将分隔符转换为“,”。
所需的输出是这个
1),Amit,Physics,80
2),Rahul,Maths,90
3),Shyam,Biology,87
4),Kedar,English,85
5),Hari,History,89
我发现可以通过
完成awk '$1=$1' FS=" " OFS="," marks.txt
但是我不明白'$1=$1'
是什么意思。
另外,当我键入
awk '{print}' FS=" " OFS=":" marks.txt>test
或
awk 'BEGIN{OFS=","}1' marks.txt >test
没有任何变化。为什么?非常感谢。
答案 0 :(得分:3)
以防在手册中具体解释有帮助时,您可以在此处查看:https://www.gnu.org/software/gawk/manual/html_node/Changing-Fields.html
最后,有时候强迫awk重建很方便 整个记录,使用字段和OFS的当前值。至 为此,请使用看似无害的分配:
$1 = $1 # force record to be reconstituted print $0 # or whatever else with $0
这将迫使awk重建记录。它确实有助于 添加评论,如此处所示。
我忍不住要指出,作者的劝告要在这里给您提供帮助!
答案 1 :(得分:2)
您可以通过在测试之前和之后打印行来自行验证。
awk '{print "BEFORE line-->" $0;$1=$1;print "AFTER line-->" $0}' FS=" " OFS="," Input_file
输出如下。
BEFORE line-->1) Amit Physics 80
AFTER line-->1),Amit,Physics,80
BEFORE line-->2) Rahul Maths 90
AFTER line-->2),Rahul,Maths,90
BEFORE line-->3) Shyam Biology 87
AFTER line-->3),Shyam,Biology,87
BEFORE line-->4) Kedar English 85
AFTER line-->4),Kedar,English,85
BEFORE line-->5) Hari History 89
AFTER line-->5),Hari,History,89
这样,我们可以看到$1=$1
重新评估了它的值并相应地更改了整行的值。
更多评论说明:
问题是,如果您重新启动$ 1或$ 2或重新评估或读取整个字段的任何行,则它将应用OFS新值。我们把它写成$ 1,我们可以写成$ 2,例如-> awk '$2=$2' FS=" " OFS="," Input_file
答案 2 :(得分:1)
分配$1=$1
是导致重新分析字段的原因。没有它,Awk只会将输入传递给输出。