Объединять каждую вторую строку из двух файлов

Смонтировать диск с гостевыми дополнениями 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

Перезагрузить

-2
24.05.2019, 12:47
6 ответов

Вы могли бы сделать:

paste -d '\n' file1 file2 | sed -n 'p;n;n;N;s/\n//p' > output

pasteсжимает два файла, чередуя по одной строке в каждом, аsedpудаляет первый, отбрасывает второй, добавляет четвертый к третьему, объединяет их и снова начинает со следующих строк.

Или с GNUsed:

paste -d '\n' file1 file2 | sed '2~4d' | paste -sd '\n\0\n' - > output

Где sedтолько discards 2-я из каждых 4 строк из вывода архивирования paste, а вторая вставка выполняет соединение.

Или еще с GNUsed:

sed 'z;n' file2 | paste -d'\0' file1 - > output

Там, где sedзаменяет одну строку (в других реализациях sed, вы можете использовать s/.*//), получить и распечатать расширение n, чтобы мы могли вставить его в файл1.

4
28.01.2020, 05:14

Используйте

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
0
28.01.2020, 05:14
$ 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 : "") }'
2
28.01.2020, 05:14

Предположим, что ввод осуществляется в файлы 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

С наилучшими пожеланиями... ура, дрл

0
28.01.2020, 05:14

Perl также позволяет чередовать строки из двух файлов желаемым образом. Файл 2 находится в стандартном вводе, а файл 1 является аргументом perl. Строка из файла2 добавляется поочередно, затем удаляется новая строка.

$ perl -pe '($_.= ($,,$,.<STDIN>)[$|--]) =~ s/\n(?!\z)//' File1 < File2
1
28.01.2020, 05:14

используя GNU sed, мы можем сделать это следующим образом:

sed -e 'R file2' file1 | sed -Ee 'N;N;N;s/\n.*(\n.*)\n/\1/'

, где мы эмулируем pasteчерез sed, а затем соединяем 4 строки вместе и манипулируем таким образом, чтобы удалить 2-ю и удалить новую строку между 3-й и 4-й. Повторите этот процесс для следующего 4-строчного слота -.

0
28.01.2020, 05:14

Теги

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