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

Shell 根据现有字段(sed或awk)的值在每行末尾添加新字段,shell,awk,sed,Shell,Awk,Sed,我有一组CSV文件,希望在每行末尾添加一个字段 第一个字段是一个ID,大约十位数: id,2nd_field,...,last_field 1234567890,Smith,...,Arkansas 1234567891,Jones,...,California 1234567892,White,..., 我想在末尾添加另一个字段,其中值基于id的模3(id%3): id,2nd_field,...,last_field,added_field 1234567890,Smith,...,Ark

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

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

id,2nd_field,...,last_field
1234567890,Smith,...,Arkansas
1234567891,Jones,...,California
1234567892,White,...,
我想在末尾添加另一个字段,其中值基于id的模3(id%3):

id,2nd_field,...,last_field,added_field
1234567890,Smith,...,Arkansas,x
1234567891,Jones,...,California,y
1234567892,White,...,,z
id,2nd_field,...,last_field,added_field
1234567890,Smith,...,Arkansas,x
1234567891,Jones,...,California,y
1234567892,White,...,,z
请考虑最后一个_字段可能为空或为空


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

使用
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
输出:

以上仅使用
split()
创建以下映射:

map[1] = y
map[2] = z
map[3] = x
然后在需要时通过通用的
(VALUE-1)%N+1
语法访问它,该语法将值
1,2,…,N-1,N
的mod
结果映射到
1,2,…,N-1,N
,而不是
1,2,…,N-1,0

map[($1-1)%3+1]
e、 g:


$awk'BEGIN{for(i=1;我到目前为止你有什么进展?重复question@Cyrus已经看到了链接。这是它应该看起来的样子(可能)
sed's/$/,/'input.csv>output.csv
,但不知道如何引用第一个字段并操作一个模。@anubhava让我们说,
$1%3==0
我们得到x,
$1%3==1
我们得到y,
$1%3==2
我们得到z。附加的是模操作的结果。我可能需要使用另一个sed。谢谢不管怎样。模块结果已经存在于结果中,您希望得到什么输出?好的,我知道了。以下是对我有效的方法。
awk-F“,“'BEGIN{OFS=“,”}{if($1%3==0)print$0”,x”;else if($1%3==1)print$0”,y;“else print$0”,z}'文件
。很抱歉,它不应该有标题行。无论如何,感谢您给我一个主意。我没有意识到您需要输出中的文字
x,y,z
。我已根据您的评论对答案进行了轻微修改。
map[($1-1)%3+1]
$ 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