sed:基于变量匹配将一个CSV的内容合并到另一个CSV

时间:2015-04-24 18:59:29

标签: bash csv sed

尝试将一个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 $1 "," $2 "," $4}' )
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

1 个答案:

答案 0 :(得分:3)

使用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在此处过分,但对于&gt; 1行文件,join要求在连接键上对文件进行排序

使用awk

$ awk -F, -v OFS=, 'NR == FNR {a[$1] = $3 OFS $4; next} $4 in a {print $0, a[$4]}' CSV2 CSV1
Bob,App1,8-Jan-15,8.8.8.8,United States,CA