【问题标题】:Subtract a constant number from a column从列中减去一个常数
【发布时间】:2016-07-25 16:31:38
【问题描述】:

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

【问题讨论】:

    标签: linux csv awk


    【解决方案1】:

    您在尝试中添加了一个额外的列。而是将您的第一个字段 $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 时减去。然后我们只打印整条记录。

    【讨论】:

    • 谢谢,但是 `awk '{$1=$1-1;print $0}' file2.csv' 只输出减去 1 的第一列。我需要输出中的所有列。
    • 我的错。我已更新脚本以将输入字段分隔符更改为逗号以及输出字段分隔符
    • 感谢@JNevill。你拯救了我的一天;)
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多