我想将.csv中的所有重复名称更改为唯一的,但在找到重复名称后,我无法到达上一行,因为它已经打印出来了.我try 保存数组中的所有行,并将它们打印到END部分,但它不起作用,而且我不知道如何访问该数组中的特定字段(awk中不支持二维数组?).

样本输入

...,9,phone,...
...,43,book,...
...,27,apple,...
...,85,hook,...
...,43,phone,...

期望输出

...,9,phone9,...
...,43,book,...
...,27,apple,...
...,85,hook,...
...,43,phone43,...

我的try ($2-id字段,$3-name字段)

BEGIN{
       FS=","
       OFS=","
       marker=777
     } 
     {
       if (names[$3] == marker) {
       $3 = $3 $2
       #Attempt to change previous duplicate
       results[nameLines[$3]]=$3 id[$3]
       }
       names[$3] = marker
       id[$3] = $2
       nameLines[$3] = NR
       results[NR] = $0
     }
END{
     #it prints some numbers, not saved lines
     for(result in results)
     print result
   }

推荐答案

下面是将所有记录存储在缓冲区中的单遍awk:

awk -F, '
{
   rec[NR] = $0
   ++fq[$3]
}
END {
   for (i=1; i<=NR; ++i) {
      n = split(rec[i], a, /,/)
      if (fq[a[3]] > 1)
         a[3] = a[3] a[2]
      for (k=1; k<=n; ++k)
         printf "%s", a[k] (k < n ? FS : ORS)
    }
}' file

...,9,phone9,...
...,43,book,...
...,27,apple,...
...,85,hook,...
...,43,phone43,...

Linux相关问答推荐

在Zenity进度窗口上单击取消后如何停止bash脚本

使用信号处理程序实现Hibernate 功能

Bash:将多行转换为单行的命令

在 bash 脚本中保持两个进程处于活动状态(并在死亡时重生它们)

jinja2.exceptions.TemplateSyntaxError:预期标记,,得到整数(支持十六进制,八进制和二进制整数文字)

如何过滤 Bash 的正则表达式(Linux)中的所有值,除了一个?

RabbitMQ 安装后没有自动启动

如何在初始化脚本中以特定用户身份运行命令?

sed: -i 不能与 Mac OS X 上的标准输入一起使用

在 Node.JS 中引用相对于应用程序根目录的文件的正确方法

更改核心转储的位置

加密/解密在两个不同的 openssl 版本之间不能很好地工作

将 bash 脚本添加到路径

Ant 找不到 javac,在 Ubuntu 上不会设置 JAVA_HOME

linux根据文件名模式搜索文件

为什么两次使用 grep 时没有显示输出?

以 qsub 开头的 shell 脚本的参数

卸载从源代码构建的python?

后缀 - status=bounced(未知用户myuser)

适用于 Windows、Linux、MacOS X 的跨平台脚​​本