Объединение файлов с неодинаковым количеством строк на основе определенного столбца в bash - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь объединить 2 файла с неодинаковым количеством строк на основе столбца 2 в каждом файле.

Файл 1

  3 09
 10 11
 28 12
 23 14

Файл 2

 10 10
 11 11
 29 12
 25 13
 25 14

После объединения файл должен быть -

 09 3 0
 10 0 10
 11 10 11
 12 28 29
 13 0 25
 14 23 25

В другом требовании, если файл 1 или файл 2 не имеет соответствующей записи, Я должен вставить 0 там. Измененный файл 1, файл 2 и объединенный файл доступны выше.

Пожалуйста, помогите.

Ответы [ 4 ]

3 голосов
/ 03 апреля 2020

Вы можете использовать эту команду gnu-awk, которая будет работать независимо от того, какой из двух файлов имеет больше записей:

awk 'FNR == NR {
   map[$2] = $1
   next
}
{
   map[$2] = ($2 in map ? map[$2] OFS : "") $1
}
END {
   PROCINFO["sorted_in"] = "@ind_str_asc"
   for (i in map)
      print i, map[i]
}' file1 file2

09 3
10 9 10
11 10 11
12 28 29
13 27 25
14 23 25
2 голосов
/ 03 апреля 2020
$ join -j 2 -a 1 -a 2 file1 file2
09 3
10 9 10
11 10 11
12 28 29
13 27 25
14 23 25

или если реальные входные файлы еще не отсортированы во 2-м столбце, как в вашем примере:

$ join -j 2 -a 1 -a 2 <(sort -k2,2 file1) <(sort -k2,2 file2)
09 3
10 9 10
11 10 11
12 28 29
13 27 25
14 23 25
1 голос
/ 03 апреля 2020

Как насчет использования join?

join -12 -22 -a1 -e 0 -o'0,1.1,2.1' f1 f2

Надеюсь, это то, что вы хотите. Полям, у которых нет совпадения, будет дано 0.

$ cat f1
3 09
9 10
10 11
28 12
27 13
23 14

$ cat f2
10 10
11 11
29 12
25 13
25 14

$ join -12 -22 -a1 -e 0 -o'0,1.1,2.1' f1 f2
09 3 0
10 9 10
11 10 11
12 28 29
13 27 25
14 23 25

Команда объединения объединяет строки двух файлов, которые имеют общее поле данных. В этом случае: Соедините файл2 и файл1, используя поле 1 (-1 2) файла f2 и поле 2 (-2 2) файла f1.

Вывод будет: joined field, field 1 of file1, field 1 of file2 - -o'0,1.1,2.1', если отсутствует поле, поставить 0 -e0

Если в одном из двух файлов больше записей, добавьте их (в данном случае file1) -a1

1 голос
/ 03 апреля 2020

Попробуйте это пожалуйста:

awk 'NR==FNR{a[$2]=$1;next}{print $2,$1,a[$2]}' file2 file1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...