从列中减去一个常数

时间:2016-07-25 16:31:39

标签: linux csv awk

我有两个大文件(~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

1 个答案:

答案 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的时间。然后我们只打印整个记录。