更改元素的值时,AWK无法识别多个字段

时间:2014-03-08 13:30:40

标签: shell csv awk

我有一个csv文件,其简化版本是:

@data
1,2,3,4,normal
1,2,3,4,normal
1,2,3,4,normal
1,2,3,4,normal
1,2,3,4,normal
1,2,3,4,normal
1,2,3,4,normal
1,2,3,4,normal
1,2,3,4,normal
1,2,3,4,normal

当我这样做时:

awk -F',' '{print NF}' myfile.csv

我明白了:

1
5
5
5
5
5
5
5
5
5
5

我正在尝试更改此数据集中5th行的10th元素,但我注意到这样做时会出现奇怪的行为。更具体的是,当我给出时:

awk -F',' 'NR==10{$5="abnormal"}1' myfile.csv | awk -F',' '{print NF}'

我明白了:

1
5
5
5
5
5
5
5
5
1
5


有没有人对此有解释或想法?

2 个答案:

答案 0 :(得分:2)

感谢@EdMorton提供有价值的评论,即为任何字段分配值会导致使用OFS值重新编译记录,默认值为space

根据更新后的问题进行更新:@drDoom,您缺少`OFS =','。 请查看以下两个输出与样本数据的差异:

/home/amit/$ awk -F',' 'NR==10{$5="abnormal"}1' OFS=',' myfile.csv | awk -F',' '{print NF}'
1
5
5
5
5
5
5
5
5
5
5
/home/amit/$ awk -F',' 'NR==10{$5="abnormal"}1'  myfile.csv | awk -F',' '{print NF}'
1
5
5
5
5
5
5
5
5
1
5

要更改第100行的第150个字段,您可以执行以下操作

awk -F',' 'NR==100{ $150 = "NewValue"}1' OFS=',' myfile.csv

答案 1 :(得分:0)

任何或所有这些都是问题:

a)您的csv文件是在Windows上创建的,因此其中包含无关的控制-M字符。

b)你的分隔符不是逗号[在每一行]。

c)你错误地计算哪一行是第100行。

执行此操作并使用输出更新您的问题:

dos2unix file
awk -F',' -v OFS=':' 'NR>98 && NR<102{print NR, NF, $1, $0}' file

请注意,我说使用输出更新问题 - 请勿将输出发布为评论,因为我们无法看到格式。