如何使用awk更改新文件中的分隔符

时间:2018-11-28 10:09:29

标签: awk

我有一个文件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

没有任何变化。为什么?非常感谢。

3 个答案:

答案 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只会将输入传递给输出。