我有两个大文件(~10GB),如下所示:
file1.csv
name,id,dob,year,age,score
Mike,1,2014-01-01,2016,2,20
Ellen,2, 2012-01-01,2016,4,35
.
.
file2.csv
id,course_name,course_id
1,math,101
1,physics,102
1,chemistry,103
2,math,101
2,physics,102
2,chemistry,103
.
.
我想从这些文件的“id”列中减去1:
file1_updated.csv
name,id,dob,year,age,score
Mike,0,2014-01-01,2016,2,20
Ellen,0, 2012-01-01,2016,4,35
file2_updated.csv
id,course_name,course_id
0,math,101
0,physics,102
0,chemistry,103
1,math,101
1,physics,102
1,chemistry,103
我尝试了awk '{print ($1 - 1) "," $0}' file2.csv
,但没有得到正确的结果:
-1,id,course_name,course_id
0,1,math,101
0,1,physics,102
0,1,chemistry,103
1,2,math,101
1,2,physics,102
1,2,chemistry,103
答案 0 :(得分:3)
您在尝试中添加了一个额外的列。而是将您的第一个字段$1
设置为$1-1
:
awk -F"," 'BEGIN{OFS=","} {$1=$1-1;print $0}' file2.csv
分号分隔命令。我们将分隔符设置为逗号(-F","
),将输出字段分隔符设置为逗号BEGIN{OFS=","}
。从第一个字段中减去1的第一个命令首先执行,然后打印命令执行第二个,因此整个记录$0
现在将在打印时包含新的$1
值。
仅从不是标题的记录中减去1可能会有所帮助。所以你可以在第一个命令中添加一个条件:
awk -F"," 'BEGIN{OFS=","} NR>1{$1=$1-1} {print $0}' file2.csv
现在我们只减去记录编号(NR
)大于1的时间。然后我们只打印整个记录。