Проблема с выводом csv при сравнении файлов csv и извлечении столбцов - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь сравнить два файла CSV на основе их первого и вывести первые два столбца файла 1, а также второй и третий столбцы файла 2 в новый файл CSV

Пример:

file1.csv

asdf123,1  
adfg234,2  
asdf567,3

file2.csv

asdf123,q,w  
asdf567,r,t  

желаемый вывод

asdf123,1,q,w  
adfg234,2,NA  
asdf567,3,r,t 

Я использовал следующий код

awk -F, 'FNR==NR{a[$1]=$0;next};{if (i in a) {print a[$1] "," $2} else {print a[$1] "," "NA"}}' file1.csv file2.csv > output.csv

Однако, команда after else, похоже, не работает и содержит пустые строки на месте, и кроме того, выходной вывод печатается следующим образом (с новыми строками между ними):

asdf123,1  
*blank space* q,w  

asdf567,3  
*blank space* r,t

Я новичок всценарии. Может кто-нибудь, пожалуйста, помогите мне исправить это.

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

В вашем скрипте было несколько ошибок:

$ awk -F, '
FNR==NR {
    a[$1]=$0
    next
}
{
    if($1 in a)              # no i anywhere, use $1
        print a[$1] "," $2 
    else 
        print $0 "," "NA"    # cant use a[$1] in this else 
}' file2 file1               # file order

Вывод:

asdf123,q,w,1
adfg234,2,NA
asdf567,r,t,3

И он не будет соответствовать вашему выводу, так как порядок файлов изменился, безеще немного усилий:

$ awk '
BEGIN {
    FS=OFS=","
}
FNR==NR {
    key=$1                  # $0="1,2,3" key=1
    $1=""                   # $0=",2,3"
    a[key]=$0               # a[1]=",2,3"
    next
}
{
    if ($1 in a) 
        print $1,$2 a[$1]
    else 
        print $0,"NA"
}' file2 file1

Выведите на этот раз:

asdf123,1,q,w
adfg234,2,NA
asdf567,3,r,t 
0 голосов
/ 07 ноября 2019

С bash, sort и GNU join:

join -t ',' -a 1 -e 'NA' <(sort file1.csv) <(sort file2.csv) -o 1.1,1.2,2.2,2.3

Вывод:

adfg234,2,NA,NA
asdf123,1,q,w
asdf567,3,r,t

См .: man join

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...