Смонтировать диск с гостевыми дополнениями VirtualBox: в меню устройства выберите параметр «Установить гостевые дополнения VirtualBox» и введите следующую команду
yum install -y linux-headers-$(uname -r)
Скопируйте VBoxLinuxAdditions.run
файл с диска в корневой каталог с помощью следующей команды:
cp /media/cd-rom/VBoxLinuxAdditions.run /root/
Сделайте его исполняемым и установите:
chmod 755 /root/VBoxLinuxAdditions.run
cd /root/Desktop
./VBoxLinuxAdditions.run
Перезагрузить
Вы могли бы сделать:
paste -d '\n' file1 file2 | sed -n 'p;n;n;N;s/\n//p' > output
paste
сжимает два файла, чередуя по одной строке в каждом, аsed
p
удаляет первый, отбрасывает второй, добавляет четвертый к третьему, объединяет их и снова начинает со следующих строк.
Или с GNUsed
:
paste -d '\n' file1 file2 | sed '2~4d' | paste -sd '\n\0\n' - > output
Где sed
только d
iscards 2-я из каждых 4 строк из вывода архивирования paste
, а вторая вставка выполняет соединение.
Или еще с GNUsed
:
sed 'z;n' file2 | paste -d'\0' file1 - > output
Там, где sed
заменяет одну строку (в других реализациях sed
, вы можете использовать s/.*//
), получить и распечатать расширение n
, чтобы мы могли вставить его в файл1.
Используйте
awk 'NR==FNR {a[NR]=$0;next} FNR%2==0 { a[FNR]=a[FNR]$0} END{for ( i in a) print a[i]}' file1 file2
.
#!/bin/bash
echo "a
B
C
D" > file1
echo 'aa
Gd
Er
Yu
Ee
Tt' > file2
awk 'NR==FNR {a[NR]=$0;next} FNR%2==0 { a[FNR]=a[FNR]$0} END{for ( i in a) print a[i]}' file1 file2
Вы получите вывод
a
BGd
C
DYu
Tt
$ awk '{ getline other <"file2" } { print $0 (FNR % 2 == 0 ? other : "") }' file1
A
BF
C
DH
Для каждой прочитанной строки file1
этот скрипт awk
также считывает строку из file2
и сохраняет ее в переменной other
. Затем он продолжает печатать строку из file1
, объединенную с переменной other
, или ничего, если номер строки нечетный.
Цикл оболочки, который будет делать то же самое:
n=0
while IFS= read -r a; do
n=$(( n + 1 ))
IFS= read -r b <&3
[ "$(( n % 2 ))" -ne 0 ] && b=""
printf '%s%s\n' "$a" "$b"
done <file1 3<file2
Этот цикл перебирает file1
, каждая строка считывается в $a
, и для каждой итерации также считывается строка изfile2
(по файловому дескриптору 3 )в $b
. Если количество строк, прочитанных из file1
до сих пор, нечетно, $b
устанавливается в пустую строку. Затем печатаются как $a
, так и $b
.
Используя paste
и GNU sed
и предполагая, что ни один из файлов не содержит символов табуляции (, поскольку они не содержатся в вопросе):
paste file1 file2 | sed '1~2s/\t.*//;s/\t//'
paste
будет создавать содержимое двух файлов рядом друг с другом, разделенных символом табуляции. Выражение sed
сначала удалит все, начиная с табуляции, в нечетных строках, а затем удалит все оставшиеся символы табуляции.
С теми же предположениями вся вышеприведенная команда sed
может быть заменена наawk
:
paste file1 file2 | awk -F '\t' '{ print $1 (FNR % 2 == 0 ? $2 : "") }'
Предположим, что ввод осуществляется в файлы z7 z8:
paste -d'\0' <(cat z7) <(sed '1~2s/^.*$//' z8)
производит:
A
BF
C
DH
Это сначала удаляет все символы в нечетных строках, оставляя новую строку. Затем вставка объединяет файлы, используя символ NULL (благодаря потоку , вставляющему файлы без разделителя для подсказки NULL ).
Это было в такой системе, как:
OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution : Debian 8.11 (jessie)
bash GNU bash 4.3.30
sed (GNU sed) 4.2.2
paste (GNU coreutils) 8.23
С наилучшими пожеланиями... ура, дрл
Perl также позволяет чередовать строки из двух файлов желаемым образом. Файл 2 находится в стандартном вводе, а файл 1 является аргументом perl. Строка из файла2 добавляется поочередно, затем удаляется новая строка.
$ perl -pe '($_.= ($,,$,.<STDIN>)[$|--]) =~ s/\n(?!\z)//' File1 < File2
используя GNU sed
, мы можем сделать это следующим образом:
sed -e 'R file2' file1 | sed -Ee 'N;N;N;s/\n.*(\n.*)\n/\1/'
, где мы эмулируем paste
через sed
, а затем соединяем 4 строки вместе и манипулируем таким образом, чтобы удалить 2-ю и удалить новую строку между 3-й и 4-й. Повторите этот процесс для следующего 4-строчного слота -.