比较每行CSV文件的第二个和第三个字段,如果匹配,则在BASH中添加第一个字段



bash脚本新手,想要比较input.csv文件中的行
如果第二个和第三个字段匹配,则
在output.csv 中添加第一个字段

input.csv

Count, Number, Name  
1, 1111, abc  
4, 2222, zyx  
5, 1111, abc  
200, 3333, xyz  
2, 1111, xyz  
4, 3333, xyz  
2, 1111, abc  

output.csv

Count, Number, Name
8, 1111, abc  
4, 2222, zyx  
204, 3333, xyz  
2, 1111, xyz   

我尝试使用awk命令,并在循环时

while IFS="," read -r   
do  
awk  
done

作为"Unix工具箱";命令主要针对数据集,其中行是独立的记录,shell解决方案可能有点复杂。

首先,我建议把工作分成几个部分。

  1. 将标题保存到变量的临时文件中(它只是一个标题,不是相关记录,但我们需要它来生成输出文件(,例如输出文件的开头
  2. 根据第2和第3字段对输入文件的其余部分进行排序
  3. 最棘手的部分是添加数字,不仅是计算相同的行数,而且在排序时,用awk或其他语言也很容易(在通过>>将比较结果添加或打印到现有文件后,前一条记录将在变量中,请参阅1。(

为什么只有几个建议而不是完整的代码?我们提供免费答案而不是免费编码服务,这里:-(

下面的脚本完成了这项工作:

#! /bin/bash
# Save the first line of the output file without spaces
cat input.csv | head -1 | tr -d ' ' > output.csv
# $ cat output.csv
# Count,Number,Name
# Find the patterns of the processing by filtering the 2nd 
# and the 3rd columns of the input file
patterns="$(cat input.csv |
tail -n +2 |
sort -k 2 |
cut -d , -f 2,3 |
uniq |
tr -d ' ')"
# $ echo "$patterns"
# 1111,abc
# 1111,xyz
# 2222,zyx
# 3333,xyz
# Do the maths and save the lines into the output file
for k in ${patterns}
do
cat input.csv |
tr -d ' ' |
grep $k |
awk -F, 'BEGIN{c=0}
{c=c+$1}
END{ printf("%s,%s,%sn", c, $2, $3)}' >> output.csv
done
# $ cat output.csv
# Count,Number,Name
# 8,1111,abc
# 2,1111,xyz
# 4,2222,zyx
# 204,3333,xyz
# End finally ensure that output file has 
# the same format with the input file
sed -i "s/,/, /g" output.csv
# $ cat output.csv
# Count, Number, Name
# 8, 1111, abc
# 2, 1111, xyz
# 4, 2222, zyx
# 204, 3333, xyz

通过分解for循环的第一次迭代,我们得到了:

$ k="1111,abc"
$ cat input.csv
Count, Number, Name
1, 1111, abc
4, 2222, zyx
5, 1111, abc
200, 3333, xyz
2, 1111, xyz
4, 3333, xyz
2, 1111, abc
$ cat input.csv | tr -d ' '
Count,Number,Name
1,1111,abc
4,2222,zyx
5,1111,abc
200,3333,xyz
2,1111,xyz
4,3333,xyz
2,1111,abc
$ cat input.csv | tr -d ' ' | grep $k
1,1111,abc
5,1111,abc
2,1111,abc
$ cat input.csv | tr -d ' ' | grep $k | awk -F, 'BEGIN{c=0}{c=c+$1}END{ printf("%s,%s,%sn", c, $2, $3)}'
8,1111,abc

1-插入数据库

2-执行相关查询

3-文件中的输出结果

最新更新