bash - 在 bash 中比较文件中的行

标签 bash shell awk

input.txt 文件

12345678,Manoj,23,Developer
12345678,Manoj,34,Developer
12345678,Manoj,67,Developer
12345679,Vijay,12,Tester
12345679,Vijay,98,Tester
12345676,Samrat,100,Manager
12345676,Samrat,25,Manager
12345676,Samrat,28,Manager

想要的输出文件

12345678,Manoj,23,Developer,0
12345678,Manoj,34,Developer,1
12345678,Manoj,67,Developer,2
12345679,Vijay,12,Tester,0
12345679,Vijay,98,Tester,1
12345676,Samrat,100,Manager,0
12345676,Samrat,25,Manager,1
12345676,Samrat,28,Manager,2

解释

这里的第一个值,即我输入文件前 3 行中的 12345678 是相同的,因此分别在前 3 行附加 ,0 ,1 和 ,2 .和下面几行类似。

如何在 Shell 脚本中完成。

在期望的输出中编辑

是否也可以将 Desired Output 数字格式更改为以下输出?

12345678,Manoj,23,Developer,0000000
12345678,Manoj,34,Developer,0000001
12345678,Manoj,67,Developer,0000002
12345679,Vijay,12,Tester,0000000
12345679,Vijay,98,Tester,0000001
12345676,Samrat,100,Manager,0000000
12345676,Samrat,25,Manager,0000001
12345676,Samrat,28,Manager,0000002

新: 是否可以从 0000019 开始编号。是否有其他选项可以初始化像 a=5、a=19、a=39 这样的变量,然后我可以从那里递增。

12345678,Manoj,23,Developer,0000019
12345678,Manoj,34,Developer,0000020
12345678,Manoj,67,Developer,0000021
12345679,Vijay,12,Tester,0000019
12345679,Vijay,98,Tester,0000020
12345676,Samrat,100,Manager,0000019
12345676,Samrat,25,Manager,0000020
12345676,Samrat,28,Manager,0000021

最佳答案

使用 awk:

$ awk 'BEGIN{FS=OFS=",";RS="\r?\n"}{print $0,a[$1]++}' file

输出:

12345678,Manoj,23,Developer,0
12345678,Manoj,34,Developer,1
12345678,Manoj,67,Developer,2
12345679,Vijay,12,Tester,0
12345679,Vijay,98,Tester,1
12345676,Samrat,100,Manager,0
12345676,Samrat,25,Manager,1
12345676,Samrat,28,Manager,2

编辑:

随着需求的变化和大量评论的出现,这里是最终版本(修订版,因为评论和 OP 中的要求不同,敲木头):

$ awk 'BEGIN{FS=","}{sub(/\r$/,"");printf "%s,%07d" ORS,$0,a[$1]++}' file

解释:

$ awk '
BEGIN { 
    FS=","
    # ORS="\r\n"                     # uncomment if Windows line-endings are desired
}      
{
    sub(/\r$/,"")                    # remove Windows line-endings (ie. \r from \r\n)
    printf "%s,%07d" ORS,$0,a[$1]++  # output zeropadded running count on $1
}' file

使用 gawk、mawk、busybox awk 和原始 awk(awk 版本 20121220)进行了测试。哦,5 年前回收了我的 Solaris 盒子。 ;D

关于bash - 在 bash 中比较文件中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54396817/

相关文章:

bash - 如何欺骗应用程序认为它的标准输出是终端,而不是管道

c - 如何在 c 中使用 execl() 函数在文件中打印 stderr 消息

Shell:将 ssh 命令结果保存到本地变量

linux - shell 中的备份脚本

bash - 将输出管道输出到具有多个输入的 bash 函数

linux - 如何使用awk进行过滤(perl自动化)

linux - 如何从 crond ( crond -l 9 ) 中避免僵尸进程

linux - 如何将变量赋值的耗时存储到bash脚本中的另一个变量?

shell - 在shell脚本的for循环中使用sqlite3会产生错误

用于从列中查找最小值的 awk 脚本