объединить 2 последовательных ряда при условии - PullRequest
1 голос
/ 12 ноября 2011

У меня есть 5 строк, таких как:

typeA;pointA1
typeA;pointA2
typeA;pointA3
typeB;pointB1
typeB;pointB2

Результат будет:

typeA;pointA1;typeA;pointA2
typeA;pointA2;typeA;pointA3
typeB;pointB1;typeB;pointB2

Возможно ли использовать sed или awk для этой цели?

Ответы [ 3 ]

2 голосов
/ 12 ноября 2011

Это легко с awk:

awk -F';' '$1 == prevType { printf("%s;%s;%s\n", $1, prevPoint, $0) } { prevType = $1; prevPoint = $2 }'

Я предположил, что пустые строки между записями не являются частью ввода;если они есть, просто введите ввод через grep -v '^$' до awk.

1 голос
/ 12 ноября 2011

паста может быть полезна в этом случае.он может сохранить много кодов:

sed '1d' file|paste -d";" file -|awk -F';' '$1==$3'

см. тест ниже

kent$  cat a
typeA;pointA1
typeA;pointA2
typeA;pointA3
typeB;pointB1
typeB;pointB2

kent$  sed '1d' a|paste -d";" a -|awk -F';' '$1==$3'
typeA;pointA1;typeA;pointA2
typeA;pointA2;typeA;pointA3
typeB;pointB1;typeB;pointB2
0 голосов
/ 12 ноября 2011

Это решение GNU sed может работать для вас:

 sed -rn '1{h;b};H;x;/^([^;]*);.*\n\1/!{s/.*\n//;x;d};s/\n/;/p' source_file

Предполагается, что пустых строк нет, иначе конвейер предварительно форматирует исходный файл с помощью sed '/^$/d' source_file

EDIT:

Если подумать, вышеупомянутое решение слишком сложное и может быть сжато до:

 sed -ne '1{h;b};H;x;/^\([^;]*\);.*\1/s/\n/;/p' source_file

Объяснение:

-n предотвращает неявную печать любых строк. Первая строка копируется в область удержания (HS дополнительный регистр), а затем делается разрыв, который завершает итерацию. Все последующие строки добавляются в ГС. HS поменялся местами с шаблоном (PS - регистр, содержащий текущую строку). HS в этой точке содержит предыдущие и текущие строки, которые теперь проверяются, чтобы увидеть, являются ли первые поля в каждой строке идентичными. Если это так, символ новой строки, разделяющий две строки, заменяется на ;, и при условии замены произошла распечатка PS. Теперь выполняется следующая итерация, текущая строка обновляет PS, а HS - предыдущую.

...