Подтвердить что ты не робот

Как присоединить пары последовательных строк в большом файле (1 миллион строк) с помощью vim, sed или другого подобного инструмента?

Мне нужно переместить содержимое каждой второй строки до строки выше, так что данные строки2 находятся рядом с линией 1, либо разделяются запятой или пробелом.

Input:

line1
line2
line3
line4

Вывод:

line1 line2
line3 line4

Я делаю это в vim с простой записью, но vim, кажется, сбой, когда я говорю, чтобы он делал это 100 000 раз... Я думаю, может быть, sed будет хорошей альтернативой, но не уверен, как это сделать что я хочу или, может быть, есть лучший вариант?

Каждая строка содержит только 1 числовое значение, у меня всего миллион строк...

4b9b3361

Ответ 1

Если я правильно понимаю, у вас есть:

line1 
line2
line3
line4
...

и вы хотите:

line1<SEP>line2
line3<SEP>line4

вы можете легко сделать это с помощью (g)awk следующим образом:

awk 'NR % 2 == 1 { o=$0 ; next } { print o "<sep>" $0 }' INPUTFILE

Смотрите здесь в действии.

Обновление: если количество строк нечетное, то выше будет опустить последнюю строку (как указал Мартин Штетнер), поэтому это не будет:

awk 'NR % 2 == 1 { o=$0 ; next } { print o "<sep>" $0 } END { if ( NR % 2 == 1 ) { print o } }' INPUTFILE

НТН

Ответ 2

попробуйте следующее:

sed -rn 'N;s/\n/ /;p' yourFile

тест с seq:

kent$  seq 10
1
2
3
4
5
6
7
8
9
10

kent$  seq 10|sed -rn 'N;s/\n/ /;p'
1 2
3 4
5 6
7 8
9 10

awk тоже работает:

awk 'NR%2{printf $0" ";next;}1' yourFile

Тест

kent$  seq 10|awk 'NR%2{printf $0" ";next;}1'
1 2
3 4
5 6
7 8
9 10

Ответ 3

Это может сработать для вас:

sed 'N;s/\n/ /' file

или

cat file | paste -d' ' - - 

Ответ 4

Хорошо, ваш пример - это в Vim.

:g/^/+t.|-jдел >

Но как насчет последней строки?

Или вы имели в виду это?

:g/^/j

Вас также может заинтересовать этот Vim script, который упрощает работу с большими файлами.

http://www.vim.org/scripts/script.php?script_id=1506

Ответ 5

Команда paste может сделать это. Его опция "-s" объединяет последовательные линии; а параметр "-d" указывает список символов, используемых в качестве разделителей, повторяя их циклически. Сначала присоединитесь к пробелу, затем с новой строкой и повторите:

seq 10 | paste -sd" \n" -

Ответ 6

$ seq 10 | sed '2~2G' | awk -v RS='' '{$1=$1; print}'
1 2
3 4
5 6
7 8
9 10

$ paste -d' ' <(sed -n 'p;n' num.txt) <(sed -n 'n;p' num.txt)
1 2
3 4
5 6
7 8
9 10

$ echo -e 'g/^/,+1j\n%p' | ex num.txt
1 2
3 4
5 6
7 8
9 10

$ seq 10 | awk 'NR%2{printf("%s ", $0); next}1'
1 2
3 4
5 6
7 8
9 10

$ seq 10 | sed 'N;s/\n/ /'
1 2
3 4
5 6
7 8
9 10

Примечание: $ seq 10 >num.txt

Ответ 7

seq 10 | awk 'ORS=NR%2?FS:RS'

В этом решении используется "тройной оператор" для установки ORS

ORS= ....... output register separator (will receive =)
NR%2 ....... test if it has division remainder of Number of Register by 2
?FS:RS ..... FS = "space" RS = "\n" (newline)