Возможно, set -r
в ~/.bashrc
, в /etc/profile
или в файле, названном одним из предыдущих (как /etc/bash.bashrc
).
Существуют более эффективные пути, но вот быстрое и грязное использование метода paste
и sed
.
$ paste -d":" t1.txt t2.txt | sed 's/://g'
aab
bbc
ccd
Вышеупомянутые соединения эти 2 файла как это:
a:ab
b:bc
c:cd
И sed
удаляет :
.
Можно воздержаться от использования sed
, это немного избыточно путем сообщения paste
ничего не использовать в качестве разделителя при присоединении к файлам:
$ paste -d "" t1.txt t2.txt
aab
bbc
ccd
Можно также использовать awk
сделать это:
$ awk 'NR==FNR{a[FNR]=$0;next} {print a[FNR] $0}' t1.txt t2.txt
aab
bbc
ccd
Это циклично выполняется через 1-й файл, t1.txt
, и хранилища это в массиве, a[FNR]
. FNR
индекс в тот массив на основе номера строки, каждая строка была в в файле t1.txt
. Впоследствии, это циклично выполняется через 2-й файл, t2.txt
, и печатает строку соответствующая строка из 1-го файла наряду с 2-м файлом.
Этот метод является немного замысловатым, но работает и делает тяжелый подъем менее сложным при использовании awk
, с точки зрения того, что продолжается.
$ join <(nl t1.txt) <(nl t2.txt)|awk '{print $2 $3}'
aab
bbc
ccd
nl ...
команды производят версии тестовых файлов с номерами строки:
$ nl t1.txt
1 a
2 b
3 c
join
управляйте затем использует эти номера строки в качестве части данных, которые характерны для обоих файлов, таким образом, это может присоединиться на нем.
$ join <(nl t1.txt) <(nl t2.txt)
1 a ab
2 b bc
3 c cd
awk
используется в конце для извлечения 2-х и 3-х столбцов сверху.
Мало используемый pr
команда может также использоваться для присоединения к файлам с помощью ее переключателя слияния -m
.
$ pr -t -m t1.txt t2.txt | awk '{print $1 $2}'
aab
bbc
ccd
paste -d '\0' t1.txt t2.txt > t3.txt
Нет это не включает символы NUL между этими двумя файлами.
Да, это является стандартным (POSIX) и портативным, и самым эффективным, чтобы можно было добраться.
От Bash оболочка пытаются работать (без любых дополнительных инструментов обработки текста):
exec 3< t1.txt
exec 4< t2.txt
while read l1 <&3 && read l2 <&4; do
echo ${l1}$l2
done > t3.txt
-
. Это также будет ужасно неэффективным особенно при использовании bash
если файлы не являются маленькими.
– Stéphane Chazelas
15.08.2013, 17:11
paste -d ''
не является портативным – Stéphane Chazelas 15.08.2013, 23:37join
каждый не будет работать со многими версиямиjoin
какjoin
ожидает вход, лексически отсортированный на ключах. Отметьте этоnl
не нумерует каждую строку. – Stéphane Chazelas 30.10.2014, 17:43