【问题标题】:Add new field at the end of each line based on value of existing field (sed or awk)根据现有字段的值(sed 或 awk)在每行末尾添加新字段
【发布时间】:2016-02-09 06:01:10
【问题描述】:

我有一组 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

请注意 last_field 可能为空或空白。

如何使用 sed 或 awk 做到这一点?我是使用这些工具的新手,请为您的脚本提供一些解释。谢谢。

【问题讨论】:

  • 到目前为止你有什么?烦人的重复问题
  • @Cyrus 已经看到了链接。这是它应该看起来的样子(也许)sed 's/$/,/' input.csv > output.csv,但不知道如何引用第一个字段并进行模运算。
  • @anubhava 我们只是说,$1 % 3 == 0 我们得到 x,$1 % 3 == 1 我们得到 y,$1 % 3 == 2 我们得到 z。

标签: shell awk sed


【解决方案1】:

使用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

【讨论】:

  • 附加的是模运算的结果。我可能需要使用另一个 sed 。还是谢谢。
  • 模块结果已经在结果中了,你期望什么输出?
  • 好的,知道了。这对我有用。 awk -F"," 'BEGIN { OFS = "," } { if ($1 % 3 == 0) print $0",x"; else if ($1 % 3 == 1) print $0",y"; else print $0",z" }' file。抱歉,它不应该有标题行。无论如何,谢谢你给我一个想法。
  • 没有意识到您在输出中需要文字 x,y,z。我已根据您的评论稍微修改了答案。
【解决方案2】:
$ 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 语法访问它,该语法将值1,2,..,N-1,N 的mod N 结果映射到1,2,..,N-1,N 而不是1,2,..,N-1,0

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

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 2012-04-30
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2021-06-25
    • 2018-04-29
    • 1970-01-01
    相关资源
    最近更新 更多