Как присоединить пары последовательных строк в большом файле (1 миллион строк) с помощью vim, sed или другого подобного инструмента?
Мне нужно переместить содержимое каждой второй строки до строки выше, так что данные строки2 находятся рядом с линией 1, либо разделяются запятой или пробелом.
Input:
line1
line2
line3
line4
Вывод:
line1 line2
line3 line4
Я делаю это в vim с простой записью, но vim, кажется, сбой, когда я говорю, чтобы он делал это 100 000 раз... Я думаю, может быть, sed будет хорошей альтернативой, но не уверен, как это сделать что я хочу или, может быть, есть лучший вариант?
Каждая строка содержит только 1 числовое значение, у меня всего миллион строк...
Ответы
Ответ 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)