2015-08-24 2 views
2

У меня есть 2 CSV файлAwk поиск и добавить соответствующий имя из другого файла CSV

файл 1 содержит

product_id, category_id, price 
pid01,cat01,10 
pid02,cat01,10 
pid03,cat01,20 
pid04,cat02,30 
pid05,cat02,20 
pid06,cat03,30 

файл 2 содержит

category_id, category_name 
cat01,Mouse 
cat02,Cat 
cat03,Fish 
cat04,Dog 

Мне нужен результат, как этот

product_id, category_id, category_name, price 
pid01,cat01,Mouse,10 
pid02,cat01,Mouse,10 
pid03,cat01,Mouse,20 
pid04,cat02,Cat,30 
pid05,cat02,Cat,20 
pid06,cat03,Fish,30 

или

product_id, category_name, price 
pid01,Mouse,10 
pid02,Mouse,10 
pid03,Mouse,20 
pid04,Cat,30 
pid05,Cat,20 
pid06,Fish,30 

Как я могу получить его в Bash или Awk?

+0

do es в первой строке файла2 содержатся заголовки – amdixon

+0

да, позвольте мне задать вопрос – billyduc

ответ

4

Это AWK будет делать это:

awk -F, 'NR==FNR{a[$1]=$2;next}FNR>1{print $1,$2,a[$2],$3}' OFS=, file2 file1 

Btw, то дополнительно нужно добавить заголовки. Позвольте мне объяснить, сценарий в многострочного формате:

# Specify the field delimiter and print the headers 
BEGIN { 
    FS=OFS="," 
    $1="product_id" 
    $2="category_id" 
    $3="category_name" 
    $4="price" 
    print 
} 

# As long as the total number of records (NR) equals 
# number of records is equal to the number of records 
# in the current input file (FNR) we populate data 
# from file2 to the lookup table 'a' 
NR==FNR{ 
    a[$1]=$2 
    next # Skip the following block and go on parsing file2 
} 

# Skip line 1 in file1, inject column 3 with the value from 
# the lookup table and output the record 
FNR>1{ 
    print $1,$2,a[$2],$3 
} 

Пожалуйста, проверьте также anubhava's comment. В gawk или mawk печать заголовков может быть проще с использованием -F', *'. Дополнительное пространство после запятой связано с тем, что в заголовках столбцов есть пробел. Я просто удалю это пространство перед обработкой.

+0

'awk -F ', *' -v OFS =, 'FNR == NR {a [$ 1] = $ 2; next} {print $ 1, $ 2, [$ 2], $ 3} 'file2 file1' также получит строку заголовка. – anubhava

+1

@anubhava Хорошая добыча! :) Я уже задавался вопросом, почему он не работал в первую очередь, но хотел завершить мои объяснения. Пропустил пространство в заголовках! Благодаря! – hek2mgl

+0

Fanstatic! Спасибо hek2mgl – billyduc

3

С присоединиться:

join --header -t , -1 2 -2 1 -o 1.1,1.2,2.2,1.3 file1 file2 

Выход:

 
pid01,cat01,Mouse,10 
pid02,cat01,Mouse,10 
pid03,cat01,Mouse,20 
pid04,cat02,Cat,30 
pid05,cat02,Cat,20 
pid06,cat03,Fish,30 
+1

Ницца, я всегда за этим инструментом. – hek2mgl

0

Вы можете создать скрипт (process_csv.sh) следующим образом:

#!/bin/sh 

data=`cat file1.csv | sed -n '/pid/,$ p'` 
data2=`cat file2.csv` 
echo "product_id, category_id, price, category_name" > final.csv 
#since category_id is common in both files, we lookup category names based on that id. 
for row in $data 
      do 
        cat_id=`printf $row | awk -F "," '{print $2'}` 
        category_name=`printf "$data2" | grep "$cat_id" | cut -f2 -d','` 
        #now we write category_name to file and append it to row/line with corresponding product_id 
        echo $row","$categor_name >> final.csv 


      done 

Просто запустите»./process_csv .sh "и файл final.csv будет содержать ваш результат

Смежные вопросы