我有一组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执行此操作?我是使用这些工具的新手,请为您的脚本提供一些解释。感谢。
答案 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