sed:根据变量匹配将一个 CSV 的内容合并到另一个
sed: to merge contents of one CSV to another based on variable match
正在尝试将来自一个 CSV 的 GEO IP 数据关联到另一个 CSV 的访问日志。
示例数据行:
CSV1
Bob,App1,8-Jan-15,8.8.8.8
April,App3,2-Jan-15,5.5.5.5
George,App2,1-Feb-15,8.8.8.8
CSV2
8.8.8.8,US,United States,CA,California,Mountain View,94040,America/Los_Angeles
5.5.5.5,US,United States,FL,Florida,Miami
我想在 CSV1 中搜索 CSV2 中列出的任何 IP,并在 IP 匹配时将字段 1、2、4 附加到 CSV1。
到目前为止我有,但我相信在 SED 部分出现了错误。
#!/bin/bash
for LINE in $( cat CSV2 | awk -F',' '{print "," "," }' )
do
$IP = $( echo $LINE | cut -d, -f1 )
sed -i.bak "s/"$IP/\""$LINE\"" CSV1
done
期望的输出:
Bob,App1,8-Jan-15,8.8.8.8,United States,CA
Dawn,App3,2-Jan-15,5.5.5.5,United States,FL
George,App2,1-Feb-15,8.8.8.8,United States,CA
使用join
命令:
$ join -t , -1 4 -2 1 -o 1.1,1.2,1.3,1.4,2.3,2.4 <(sort -t, -k4,4 CSV1) <(sort -t, CSV2)
Bob,App1,8-Jan-15,8.8.8.8,United States,CA
在这里使用 sort
有点矫枉过正,但是对于 >1 行文件,join
需要根据连接键对文件进行排序
使用 awk
$ awk -F, -v OFS=, 'NR == FNR {a[] = OFS ; next} in a {print [=11=], a[]}' CSV2 CSV1
Bob,App1,8-Jan-15,8.8.8.8,United States,CA
正在尝试将来自一个 CSV 的 GEO IP 数据关联到另一个 CSV 的访问日志。
示例数据行:
CSV1
Bob,App1,8-Jan-15,8.8.8.8
April,App3,2-Jan-15,5.5.5.5
George,App2,1-Feb-15,8.8.8.8
CSV2
8.8.8.8,US,United States,CA,California,Mountain View,94040,America/Los_Angeles
5.5.5.5,US,United States,FL,Florida,Miami
我想在 CSV1 中搜索 CSV2 中列出的任何 IP,并在 IP 匹配时将字段 1、2、4 附加到 CSV1。
到目前为止我有,但我相信在 SED 部分出现了错误。
#!/bin/bash
for LINE in $( cat CSV2 | awk -F',' '{print "," "," }' )
do
$IP = $( echo $LINE | cut -d, -f1 )
sed -i.bak "s/"$IP/\""$LINE\"" CSV1
done
期望的输出:
Bob,App1,8-Jan-15,8.8.8.8,United States,CA
Dawn,App3,2-Jan-15,5.5.5.5,United States,FL
George,App2,1-Feb-15,8.8.8.8,United States,CA
使用join
命令:
$ join -t , -1 4 -2 1 -o 1.1,1.2,1.3,1.4,2.3,2.4 <(sort -t, -k4,4 CSV1) <(sort -t, CSV2)
Bob,App1,8-Jan-15,8.8.8.8,United States,CA
在这里使用 sort
有点矫枉过正,但是对于 >1 行文件,join
需要根据连接键对文件进行排序
使用 awk
$ awk -F, -v OFS=, 'NR == FNR {a[] = OFS ; next} in a {print [=11=], a[]}' CSV2 CSV1
Bob,App1,8-Jan-15,8.8.8.8,United States,CA