Пожалуйста, используйте приведенную ниже команду, чтобы достичь яичек и работать нормально
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:~$
Обычно это работа для 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"
Использование Миллера(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
для установки поля соединения.