使用awk向csv文件添加索引列

3
如何使用awk为csv文件添加索引?例如,假设我有一个文件data.txt。
col1,col2,col3
a1,b1,c1
a2,b2,c2
a3,b3,c3

我想添加另一列,即索引。基本上我希望输出为:
,col1,col2,col3
0,a1,b1,c1
1,a2,b2,c2
2,a3,b3,c3

我试图使用 awk '{for (i=1; i<=NF; i++) print $i}',但好像没有正常工作。那么,在第一行只添加逗号的最佳方法是什么?而对于其余的行,则需要添加递增数字和逗号?

4个回答

4
您可以使用以下的 awk 解决方案:
awk '{print (NR == 1 ? "" : NR-2) "," $0}' file

,col1,col2,col3
0,a1,b1,c1
1,a2,b2,c2
2,a3,b3,c3

谢谢,那个有效。NR-2如何获得递增的数字?我知道其余部分更像是一个条件语句,如果是第一行就会是空白,但是对于NR-2的工作方式有点困惑。 - user1179317
3
哦,这是行号减2的意思。明白了,哈哈。 - user1179317
另一种选择是增量 awk '{print (NR==1?"":n++)","$0}' file。它们本质上是相同的,我提到它的唯一原因是好奇心是否减法或后增量会比另一个节省一些时钟周期。不知道哪种方式更好。 - David C. Rankin

2

2

我将使用GNU AWK 来完成这个任务,步骤如下所示,假设 file.txt 中的内容为:

col1,col2,col3
a1,b1,c1
a2,b2,c2
a3,b3,c3

那么

awk 'BEGIN{OFS=","}{print NR==1?"":i++,$0}' file.txt

输出结果

,col1,col2,col3
0,a1,b1,c1
1,a2,b2,c2
2,a3,b3,c3

解释:首先我告诉GNU AWK输出字段分隔符(OFS)是,,因此print的参数将使用该字符连接。然后对于每一行,我使用所谓的三元运算符即条件?真值:假值来决定第一个参数是什么,对于第一行(NR==1),它是空字符串,对于所有其他行,它是将被首先返回并增加1的计数器,第二个打印参数始终是整个原始行($0)。

(在gawk 4.2.1中测试)


在任何awk、mawk、gawk等中都可以正常运行。 - David C. Rankin

-1
gawk 'sub("^",substr(++_",",3^(NF~NR)))' FS='^$' \_=-2
mawk 'sub("^",++_+NF ? _",":",")' FS='^$' \_=-2 
,col1,col2,col3
0,a1,b1,c1
1,a2,b2,c2
2,a3,b3,c3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接