Соединение двух последовательных линий с помощью awk или sed

Соединение двух последовательных линий с помощью awk или sed

07.07.2010 04:15:10 Просмотров 19 Источник

Как бы я соединил две линии, используя awk или sed?

for e.g.:

У меня есть данные, которые выглядят так:

abcd
joinabcd
efgh
joinefgh
ijkl
joinijkl

Мне нужен выход, как тот, что ниже:

joinabcdabcd
joinefghefgh
joinijklijkl
У вопроса есть решение - Посмотреть?

Ответы - Соединение двух последовательных линий с помощью awk или sed / Joining two consecutive lines using awk or sed

bashflyng

07.07.2010 04:27:42

awk 'BEGIN{i=1}{line[i++]=$0}END{j=1; while (j<i) {print line[j+1] line[j]; j+=2}}' yourfile

Нет необходимости в седе.

https://stackoverflow.com/questions/3194534/joining-two-consecutive-lines-using-awk-or-sed/3194634#comment3291579_3194634
Хороший ответ....но я полагаю, что попросил полную строку, а не только первую field.so теперь его нужно изменить как line[i++]=$0вместо line[i++]=$1.Но очень хороший ответ Спасибо:)
Beta

07.07.2010 04:52:11

Вот он в седе:

sed 'h;s/.*//;N;G;s/\n//g' < filename
https://stackoverflow.com/questions/3194534/joining-two-consecutive-lines-using-awk-or-sed/3194786#comment3300086_3194786
Перенаправление не нужно.
Является ответом!
Dimitre Radoulov

07.07.2010 08:43:06

awk '!(NR%2){print$0p}{p=$0}' infile
https://stackoverflow.com/questions/3194534/joining-two-consecutive-lines-using-awk-or-sed/3196948#comment64469112_3196948
Кто-нибудь может объяснить, как работает это выражение awk? В основном-то !(NR%2) часть.
https://stackoverflow.com/questions/3194534/joining-two-consecutive-lines-using-awk-or-sed/3196948#comment65639483_3196948
NR представляет собой число строк... % - это оператор modulu (то есть a%b-остаток, когда a делится на b)... (NR%2) является модулем NR на два, то есть истинно, когда NR четно, и ложно, когда нечетно... !(NR%2) истинно, когда NR нечетно, таким образом... !(NR%2){print$0p} означает, что программа будет печатать строку, связанную с переменной p, только на нечетных строках... {p=$0} означает, что в каждой строке p устанавливается как текущая строка (но только после печати текущей и предыдущей строки, если текущая строка нечетна).
https://stackoverflow.com/questions/3194534/joining-two-consecutive-lines-using-awk-or-sed/3196948#comment84051283_3196948
При нечетном числе входных строк этот метод не будет печатать конечную строку.
https://stackoverflow.com/questions/3194534/joining-two-consecutive-lines-using-awk-or-sed/3196948#comment84059225_3196948
@BryonNicoson, правильно, хотя образец OP, казалось, имел четное число строк. Это будет обрабатывать нечетное число строк: awk 'END{if((NR%2))print p}!(NR%2){print$0p}{p=$0}'
user1655920

10.06.2014 09:09:09

Некоторые улучшения к сценарию " sed " выше, что займет следующее: Одна тысяча восемь
-2734406.132904 Две тысячи восемьсот сорок шесть
-2734414.838455 Четыре тысячи шестьсот тридцать шесть
-2734413.594009 Шесть тысяч четыреста пятьдесят шесть
-2734417.316269 Восемь тысяч двести семьдесят шесть
-2734414.779617

  and make it :    

1008 -2734406.132904
2846 -2734414.838455
4636 -2734413.594009
6456 -2734417.316269
8276 -2734414.779617

  the "sed" is : "sed 'h;s/.*//;G;N;s/\n/ /g'"
Chris Koknat

15.09.2015 08:18:23

Они говорят, что подражание-это самая искренняя форма лести.
Вот решение Perl, вдохновленное кодом awk Дмитрия:

perl -lne 'print "$_$p" if $. % 2 == 0; $p = $_' infile

$_- это текущая строка
$.это номер строки

Bryon Nicoson

30.01.2018 09:20:11

Вы можете использовать printf с тернарным:

    awk '{printf (NR%2==0) ? $0 "\n" : $0}'
https://stackoverflow.com/questions/3194534/joining-two-consecutive-lines-using-awk-or-sed/48528052#comment100569316_48528052
Этот ответ является наиболее доступным и простым для понимания из всех ответов
Mark

07.02.2020 07:29:21

Это ответ на вопрос "Как сделать так, чтобы счетчик и файл отображались в одной строке" в команде:

находить. - тип f-exec fgrep-ci "MySQL" {} \; - печать

Ответ Брайона Николсона дал наилучший результат.

Закрыть X