объединить два CSV-файла / Извлечь данные, используя два CSV-файла в оболочке (с помощью AWK) - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть два файла CSV

csv 1:

a0,|a1|a2|a3|
b0,|b1|b2|b3|
c0,|c1|c2|c3|

csv 2:

a2,5
a3,7
c3,10
d6,3
b2,6

вывод (может быть не отсортирован):

a0,a2(5);a3(7)
b0,b2(6)      
c0,c3(10)     
others,d6(3)  

Я попытался использовать grep и сделал это. Но я думаю, что это займет много времени и времени.

#My tried code
while IFS= read -r line
do
  f=$(echo "$line" | cut -d, -f1)
  f1=$(echo "$line" | cut -d, -f2)
  echo "$(cat csv1.csv | grep "|$f|" | cut -d, -f1),$f($f1)" >> output
done < csv2.csv

Вывести что-то, что я могу произвести

a0, a2 (5) a0, a3 (6) c0, c3 (6)

Может кто-нибудь помочь мнедобиться результата, ожидаемого в сценарии оболочки ??

1 Ответ

0 голосов
/ 06 ноября 2019

РЕДАКТИРОВАТЬ: Поскольку OP изменил разделители, добавьте это решение (написано и протестировано с показанными образцами).

awk '
FNR==NR{
  gsub(/^ +| +$/,"",$3)
  a[$1]=$2
  next
}
{
  num=split($2,array,"|")
}
{
  for(i=1;i<=num;i++){
    if(array[i] in a){
      val=(val?val ";":"")array[i] "(" a[array[i]] ")"
    }
  }
  $2=val
  val=""
}
1
' FS="," OFS="," file2 file1


Не могли бы вы попробовать следующее.

awk '
FNR==NR{
  gsub(/^ +| +$/,"",$3)
  a[$2]=$3
  next
}
FNR==1{
  print
  next
}
{
  num=split($3,array,",")
}
{
  for(i=1;i<=num;i++){
    if(array[i] in a){
      val=(val?val ",":"")array[i] "(" a[array[i]] ")"
    }
  }
  $3=val
  val=""
}
1
' FS="|" OFS="|"  Input_file2  Input_file1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...