Если упорядочить окончательный набор результатов не является проблемой, на ум приходит команда join
, за исключением пары проблем:
- может объединяться только в одном поле
- входные данные должны быть отсортированы по полю соединения
Мы можем обойти это с помощью нескольких наборов преобразований ...
Начнем с рассмотрения того, как это будет сделано, если данные находятся в 2 файлах:
$ cat f1
Zeaxanthin
Zeaxanthin diglucoside
Zentinic
Zephyramine
(Z)-Phenylacetaldehyde oxime
Zymosterol
Zymosterone
$ cat f2
C00371 Zeatin
C06098 Zeaxanthin
C15969 Zeaxanthin diglucoside
C15984 Zeaxanthin diglucoside diester
C08590 Zeinoxanthin
C16075 (Z)-Phenylacetaldehyde oxime
C05437 Zymosterol
C22136 Zymosterone
По умолчанию join
использует пробел в качестве разделителя между полями; но поскольку мы хотим включить пробелы в наше поле соединения, нам нужно ввести новый разделитель (исключительно для цели команды join
). Мы можем сделать это, введя другой символ в качестве разделителя ... при условии, что используемый нами символ не должен существовать в файлах данных.
В этом примере мы будем использовать запятую (,
); для файла f1
мы введем запятую в качестве ведущего символа, а для файла f2
мы заменим первый пробел на запятую:
$ sed 's/^/,/' f1
,Zeaxanthin
,Zeaxanthin diglucoside
,Zentinic
,Zephyramine
,(Z)-Phenylacetaldehyde oxime
,Zymosterol
,Zymosterone
$ sed 's/ /,/' f2
C00371,Zeatin
C06098,Zeaxanthin
C15969,Zeaxanthin diglucoside
C15984,Zeaxanthin diglucoside diester
C08590,Zeinoxanthin
C16075,(Z)-Phenylacetaldehyde oxime
C05437,Zymosterol
C22136,Zymosterone
В этот момент оба набора данных теперь имеют 2 поля (на основе разделителя запятой). Да, поле № 1 для файла f1
является нулевым.
С точки зрения join
мы планируем объединить 2 набора данных на основе поля № 2, но сначала нам нужно получить данные, отсортированные по поле № 2 ... что мы можем сделать с помощью команды sort
.
В обоих случаях мы отсортируем наборы данных по полю № 2 (используя запятую в качестве разделителя):
$ sed 's/^/,/' f1 | sort -t, -k2
,(Z)-Phenylacetaldehyde oxime
,Zeaxanthin
,Zeaxanthin diglucoside
,Zentinic
,Zephyramine
,Zymosterol
,Zymosterone
$ sed 's/ /,/' f2 | sort -t, -k2
C16075,(Z)-Phenylacetaldehyde oxime
C00371,Zeatin
C06098,Zeaxanthin
C15969,Zeaxanthin diglucoside
C15984,Zeaxanthin diglucoside diester
C08590,Zeinoxanthin
C05437,Zymosterol
C22136,Zymosterone
Теперь мы готовы передать эти наборы данных в join
:
$ join -j2 -t, -o1.1,1.2 <(sed 's/ /,/' f2 | sort -t, -k2) <(sed 's/^/,/' f1 | sort -t, -k2)
C16075,(Z)-Phenylacetaldehyde oxime
C06098,Zeaxanthin
C15969,Zeaxanthin diglucoside
C05437,Zymosterol
C22136,Zymosterone
ПРИМЕЧАНИЕ: -o1.1,1.2
говорит, что отображать только поля № 1 и № 2 из первого набора данных .
Все, что нужно на этом этапе - это снять нашу запятую; мы можем сделать это с помощью другой команды sed
:
$ join -j2 -t, -o1.1,1.2 <(sed 's/ /,/' f2 | sort -t, -k2) <(sed 's/^/,/' f1 | sort -t, -k2) | sed 's/,/ /'g
C16075 (Z)-Phenylacetaldehyde oxime
C06098 Zeaxanthin
C15969 Zeaxanthin diglucoside
C05437 Zymosterol
C22136 Zymosterone
Теперь, чтобы обратиться к тому же набору данных, но хранящемуся в 2x переменных ...
$ echo "
++++++++++++++++++++
${variable_1}
++++++++++++++++++++
${variable_2}
++++++++++++++++++++
"
++++++++++++++++++++
Zeaxanthin
Zeaxanthin diglucoside
Zentinic
Zephyramine
(Z)-Phenylacetaldehyde oxime
Zymosterol
Zymosterone
++++++++++++++++++++
C00371 Zeatin
C06098 Zeaxanthin
C15969 Zeaxanthin diglucoside
C15984 Zeaxanthin diglucoside diester
C08590 Zeinoxanthin
C16075 (Z)-Phenylacetaldehyde oxime
C05437 Zymosterol
C22136 Zymosterone
++++++++++++++++++++
This должно быть (относительно) легко, потому что нам просто нужно заменить ссылки на наши файлы нашими переменными, и для этого примера мы передадим переменные начальным командам sed
в виде следующих строк:
$ join -j2 -t, -o1.1,1.2 <(sed 's/ /,/' <<< "${variable_2}" | sort -t, -k2) <(sed 's/^/,/' <<< "${variable_1}" | sort -t, -k2) | sed 's/,/ /'
C16075 (Z)-Phenylacetaldehyde oxime
C06098 Zeaxanthin
C15969 Zeaxanthin diglucoside
C05437 Zymosterol
C22136 Zymosterone