根据现有字段的值(sed或awk)在每行末尾添加新字段

时间:2016-02-09 06:01:10

标签: shell awk sed

我有一组CSV文件,我希望在每行的末尾添加一个字段。

第一个字段是一个ID,一些十位数字:

eval-tests.rkt> 
; foo: undefined;
;  cannot reference undefined identifier
; Context:
;  /Users/.../code/gen-scheme/lib/eval-tests.rkt:1:1 [running body]

我想在最后添加另一个字段,其值基于ID的模3(id%3):

id,2nd_field,...,last_field
1234567890,Smith,...,Arkansas
1234567891,Jones,...,California
1234567892,White,...,

请考虑 last_field 可能为空或空白的事实。

如何使用sed或awk执行此操作?我是使用这些工具的新手,请为您的脚本提供一些解释。感谢。

2 个答案:

答案 0 :(得分:2)

使用awk

awk 'BEGIN{FS=OFS=","} NR==1{print $0, "added_field"; next}
     ($1%3)==0{p="x"} ($1%3)==1{p="y"} ($1%3)==2{p="z"} {print $0, p}' file

<强>输出:

id,2nd_field,...,last_field,added_field
1234567890,Smith,...,Arkansas,x
1234567891,Jones,...,California,y
1234567892,White,...,,z

答案 1 :(得分:1)

$ cat tst.awk
BEGIN { FS=OFS=","; split("y,z,x",map) }
{ print $0, (NR>1 ? map[($1-1)%3+1] : "added_field") }

$ awk -f tst.awk file
id,2nd_field,...,last_field,added_field
1234567890,Smith,...,Arkansas,x
1234567891,Jones,...,California,y
1234567892,White,...,,z

以上只是使用split()创建了一个映射:

map[1] = y
map[2] = z
map[3] = x

然后在需要时通过常见的(VALUE-1)%N+1语法访问它,该语法将值N的结果映射为1,2,..,N-1,N而不是1,2,..,N-1,N而不是1,2,..,N-1,0

map[($1-1)%3+1]

e.g:

$ awk 'BEGIN{ for (i=1;i<=6;i++) print i, i%3, (i-1)%3+1 }'
1 1 1
2 2 2
3 0 3
4 1 1
5 2 2
6 0 3