Объединение совпадающих идентификаторов из двух файлов с другими столбцами из обоих файлов

Пожалуйста, используйте приведенную ниже команду, чтобы достичь яичек и работать нормально

count=`wc -l filename| awk '{print $1}'`
praveen@praveen:~$
praveen@praveen:~$ for ((i=1;i<=$count;i++)); do j=`sed -n ''$i'p' filename`;awk -v i="$i" 'NR == i {print $0}' filename >$j.txt;done
praveen@praveen:~$ 
1
01.05.2020, 21:05
2 ответа

Обычно это работа для join. Однако joinтребует отсортированного ввода, а sortбудет ставить числа перед буквами во всех известных мне локалях (, пожалуйста, поправьте меня, если это не так ). Так что joinможет помочь вам пройти только часть пути:

$ join -t';' <(sort fileA) <(sort fileB)
1;"sam";"khon"
id;name;surname

Это можно обойти, соединив сначала первую строку каждого файла, а затем остальные:

$ join -t';' <(head -n1 fileA) <(head -n1 fileB)
id;name;surname
$ join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort)
1;"sam";"khon"

Затем, сгруппировав их в подоболочку и перенаправив вывод, вы получите желаемый результат:

 $ ( join -t';' <(head -n1 fileA) <(head -n1 fileB); join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort))
id;name;surname
1;"sam";"khon"

Так что вы могли бы сделать это:

( 
    join -t';' <(head -n1 fileA) <(head -n1 fileB); 
    join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort)
) > file3

Кроме того, вы действительно можете сделать это вawk:

$ awk -F';' '(NR==FNR){data[$1]=$1";"$2; next} 
             ($1 in data){print data[$1]";"$2}' fileA fileB 
id;name;surname
1;"sam";"khon"
0
28.04.2021, 23:16

Использование Миллера(https://github.com/johnkerl/miller)и запуск

mlr --csv --fs ";" join -j id -f fileA.csv fileB.csv >file3.csv

у вас есть

+----+------+---------+
| id | name | surname |
+----+------+---------+
| 1  | sam  | khon    |
+----+------+---------+

Некоторые примечания:

  • --fsдля установки разделителя полей;
  • -jдля установки поля соединения.
0
28.04.2021, 23:16

Теги

Похожие вопросы