我有一个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
有没有人对此有解释或想法?
答案 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
请注意,我说使用输出更新问题 - 请勿将输出发布为评论,因为我们无法看到格式。