LINUX.ORG.RU

Сортировка таблицы А по заголовкам таблицы Б

 , ,


0

1

Добрый день! Есть таблица

1	a
2	
3	c
5	d
6	
7	e
и столбец заголовков:
1	
2
3
4
5
6
7
8
9

Как стардартными утилитами unixutils, желательно однострочником sed, grep, diff, sort выполнить сортировку первой таблицы относительно второй, чтобы на выходе получить

1	a
2	
3	c
4
5	d
6	
7	e
8
9
Есть конструкция, сортирующая файл по строкам: Отфильтровать файл 1 по строкам, содержащимся в файле 2: grep -F -f file2.txt file1.txt > include.txt Но она не подходит.


Плохой пример, не наглядный.

futurama ★★★★★
()

Это не сортировка, а подбор значения по ключу. Надеюсь, ты не будешь работать программистом.

anonymous
()

например (с точностью до [:space:]): join -a2 file1 file2 , но да, сие не есть сортировка

anonymous
()
Ответ на: комментарий от anonymous

Да, прошу прощения, это не сортировка, объединение массивов. Хорошо, постараюсь нагляднее, есть 2 таблицы с заголовками:

a	b	c	d	e
1	2	3	4	5

b	c	g	f	h
6	7	8	9	0

Нужно создать общую таблицу. В случае, если заголовки столбцов одинаковы, значения полей должны быть помещены друг под другом, а если разные - добавить соответствующие поля в общую таблицу:

a	b	c	d	e	g	f	h
1	2	3	4	5
	6	7			8	9	0
За join спасибо, попробую.

xseed
() автор топика
Ответ на: комментарий от anonymous

Никак не пойму, почему не могу прикрутить в качестве выходного разделителя полей символ табуляции: 1.txt

1	a	a
2		
3	c	c
5	d	d
6		
7	e	e

2.txt

1		
2		
3	50	50
4	60	60
5	70	70
6	80	80
7		
8		
9		

Без использования параметра -t таблицы объединяются успешно, но разделителем является пробел:

C:\nncron>join -a2 out.txt out2.txt
1 a a
2
3 c c 50 50
4 60 60
5 d d 70 70
6  80 80
7 e e
8
9

Если использую параметр -t, то вместо объединенной таблицы выводится просто файл 2:

C:\nncron>join -t "\t" -a2 1.txt 2.txt
1
2
3       50      50
4       60      60
5       70      70
6       80      80
7
8
9

Как это исправить?

xseed
() автор топика
Ответ на: комментарий от anonymous

Насколько я понимаю в терминологии баз данных эта процедура называется FULL OUTER JOIN. У меня по какой-то причине перестает работать join если в параметре -o более чем 8192 символа. Строка просто не выводится на консоль из bat-файла, а обрезается до начала следующего пайпа (|):

 join.bat
sed -e "1,151d" out.txt   | sort -k2   | join -j 2 -a1 -a2 -o 1.1,2.1,0,1.3,1.4,1.5,1.6,1.7,1.8,1.9,1.10,1.11,1.12,1.13,1.14,1.15,...,1.1316,1.1317,1.1318,2.3,2.4,2.5,2.6,2.7,2.8,2.9,2.10 -e 987879798897 - A. | sort -nk1,1 -k2,2   | sed -e "s/ /\t/g;s/987879798897//g;s/\x1B/ /g"
При этом не выводятся на консоль параметры join от 8192 строки до начала следующего пайпа (в данном случае не вывелся «txt» после A.) Похоже, что это ограничение cmd на длину командной строки работает, но почему тогда выводится остальная часть команды после |, непонятно:
"| sort -nk1,1 -k2,2 | sed -e "s/ /\t/g;s/987879798897//g;s/\x1B/ /g" | cut -f 3- > B.txt"

xseed
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.