2015-03-02 2 views
0

У меня есть два файла TSV, и я хочу объединить их на основе общности в первом столбце. Столбец без заголовка, но данные - это имя каждой компании.Объединить TSV на основе столбца, для нескольких строк

У меня есть awk-код, который близок к тому, что я хочу. Проблема в том, что я хочу объединить информацию за каждый раз, когда упоминается компания, а не только в первый раз.

items.tsv выглядит следующим образом:

IBM 0.0107 100.0% 
APPL 0.0457 98.0% 
GOOGL 0.0227 100.0% 
GOOGL 0.0197 100.0% 
GOOGL 0.0997 90.0% 
GOOGL 0.0397 10.0% 

vendors.tsv:

IBM Dec 2011 
APPL Jan 2014 
GOOGL June 2015 

С кодом у меня есть, выход:

IBM 0.0107 100.0% Dec 2011 
APPL 0.0457 98.0% Jan 2014 
GOOGL 0.0227 100.0% June 2015 

Три линии отсутствуют ! Нужный выход заключается в следующем:

IBM 0.0107 100.0% Dec 2011 
APPL 0.0457 98.0% Jan 2014 
GOOGL 0.0227 100.0% June 2015 
GOOGL 0.0197 100.0% June 2015 
GOOGL 0.0997 90.0% June 2015 
GOOGL 0.0397 10.0% June 2015 

Это код, который я использую:

awk ' 
    BEGIN {FS=OFS="\t"} 
    NR==FNR {a[$1] = $2 FS $3; next} 
    $1 in a {print $1, a[$1], $2, $3} 
' items.tsv vendors.tsv 

порядок строк не имеет значения. Данные разделяются вкладками \ t. Я надеюсь, что кто-то там может помочь!

(Обратите внимание, что код AWK идентичен тому, что я использовал, вывод напечатал мной, так \ т есть некоторые места, регулярное пространство и т.д.)

ответ

1

Вопрос был только порядок входные файлы. С идиомой NR == FNR (обычно) первый файл считывается в массив, а затем строка выводится для каждой записи во втором файле, используя массив для «объединения» с информацией из первого файла. Поскольку у вас был файл поставщиков в качестве второго файла, было записано три записи и выписано три строки.

Также важно, чтобы первый файл имел уникальные ключи для использования в качестве индексов массива. Может быть только один a["GOOGL"], но опять же, переключая порядок входных файлов, эта проблема также исчезает.

$ cat vendors.tsv 
IBM Dec 2011 
APPL Jan 2014 
GOOGL June 2015 

$ cat item.tsv 
IBM 0.0107 100.0% 
APPL 0.0457 98.0% 
GOOGL 0.0227 100.0% 
GOOGL 0.0197 100.0% 
GOOGL 0.0997 90.0% 
GOOGL 0.0397 10.0% 

$ cat merge.awk 
BEGIN {FS=OFS="\t"} 
NR==FNR {a[$1] = $2 FS $3; next} 
$1 in a { print $1, $2, $3, a[$1] } 

$ awk -f merge.awk vendors.tsv item.tsv 
IBM 0.0107 100.0% Dec 2011 
APPL 0.0457 98.0% Jan 2014 
GOOGL 0.0227 100.0% June 2015 
GOOGL 0.0197 100.0% June 2015 
GOOGL 0.0997 90.0% June 2015 
GOOGL 0.0397 10.0% June 2015 
Смежные вопросы