Конкатенация двух полей двух файлов

Возможно, set -r в ~/.bashrc, в /etc/profile или в файле, названном одним из предыдущих (как /etc/bash.bashrc).

4
15.08.2013, 15:41
3 ответа

вставка и sed

Существуют более эффективные пути, но вот быстрое и грязное использование метода 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 сделать это:

$ 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 и nl

Этот метод является немного замысловатым, но работает и делает тяжелый подъем менее сложным при использовании 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 и awk

Мало используемый pr команда может также использоваться для присоединения к файлам с помощью ее переключателя слияния -m.

$ pr -t -m  t1.txt t2.txt  | awk '{print $1 $2}'
aab
bbc
ccd
3
27.01.2020, 20:56
  • 1
    paste -d '' не является портативным –  Stéphane Chazelas 15.08.2013, 23:37
  • 2
    join каждый не будет работать со многими версиями join как join ожидает вход, лексически отсортированный на ключах. Отметьте это nl не нумерует каждую строку. –  Stéphane Chazelas 30.10.2014, 17:43
paste -d '\0' t1.txt t2.txt > t3.txt

Нет это не включает символы NUL между этими двумя файлами.

Да, это является стандартным (POSIX) и портативным, и самым эффективным, чтобы можно было добраться.

1
27.01.2020, 20:56

От Bash оболочка пытаются работать (без любых дополнительных инструментов обработки текста):

exec 3< t1.txt
exec 4< t2.txt

while read l1 <&3 && read l2 <&4; do
    echo ${l1}$l2
done > t3.txt
0
27.01.2020, 20:56
  • 1
    Обратите внимание, что это предполагает, что данные не содержат пробела, подстановочного знака или символов обратной косой черты, и строки не запускаются с -. Это также будет ужасно неэффективным особенно при использовании bash если файлы не являются маленькими. –  Stéphane Chazelas 15.08.2013, 17:11

Теги

Похожие вопросы