Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash awk搜索并合并来自2个单独CSV文件的数据_Bash_Shell_Scripting_Sed_Awk - Fatal编程技术网

Bash awk搜索并合并来自2个单独CSV文件的数据

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" 也就是说:

两个单独的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”,第二个文件是“文件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