Bash awk搜索并合并来自2个单独CSV文件的数据
两个单独的CSV文件中有数据,共享一个公共IP地址Bash awk搜索并合并来自2个单独CSV文件的数据,bash,shell,scripting,sed,awk,Bash,Shell,Scripting,Sed,Awk,两个单独的CSV文件中有数据,共享一个公共IP地址 文件1:,4112.175.173.80,TCP,80 文件2:,112.175.173.80,0,不适用,未知,未知 最终结果如下所示: 文件3:,4112.175.173.80,TCP,80,0,不适用,未知,未知 我使用了sed和awk来获取数据,但这次挑战超出了我的知识范围。如果你的目标是合并这两个文件,那么join就是你可能要找的工具 $ join -t , -1 3 -2 2 "File 1" "File 2" 也就是说:
- 文件1:
,4112.175.173.80,TCP,80
- 文件2:
,112.175.173.80,0,不适用,未知,未知
- 文件3:
,4112.175.173.80,TCP,80,0,不适用,未知,未知
我使用了
sed
和awk
来获取数据,但这次挑战超出了我的知识范围。如果你的目标是合并这两个文件,那么join
就是你可能要找的工具
$ join -t , -1 3 -2 2 "File 1" "File 2"
也就是说:使用“,”作为字段分隔符。对于第一个文件,要比较的字段是第三个。因为第二个文件是第二个。第一个文件是“文件1”,第二个文件是“文件2”。这可能适合您(GNU-sed):
这将把file2变成一个sed脚本,在file1上运行以生成file3。IP地址周围不规则的间隔将使生活变得比没有它更困难。这可以通过预处理阶段解决吗?此外,有趣的是,在每一行的开头都保留了一个空字段——这不是不可能的,只是很奇怪。如果与此不同,您是否可以编辑您的问题以包含您正在处理的原始数据?请注意,如果文件中有多行,则它们必须按连接键字段的顺序排序。
$ cat file1
, 4 ,112.175.173.80 ,TCP ,80
$
$ cat file2
,112.175.173.80, 0, N/A, unknown, unknown
$
$ awk -F' *, *' -v OFS=", " 'NR==FNR{a[$2]=$3 OFS $4 OFS $5 OFS $6; next} {print $0, a[$3]}' file2 file1
, 4 ,112.175.173.80 ,TCP ,80, 0, N/A, unknown, unknown
sed -r 's|(,[^,]*)(.*)|/\1/s#$#\2#|' file2 | sed -f - file1 >file3