Шаблоны без захвата с помощью vi или sed - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть файл с примерно 100 000 строк.Есть ли хорошее регулярное выражение, которое я мог бы использовать с vi или sed для преобразования входного файла в выходной?Часть строки, разделенная каналом, может содержать сотни записей

Чтобы подвести итог того, что нужно сделать, мне нужно захватить выражение в начале строки, которое затем добавляется к каждой записи (т.е.перед любой трубой или концом линии)

Вход

G1778-BRAZIL    .A3_Alagoas|.A5_Amazonas|.B3_Bahia|.C4_Ceara|.D5_Distrito Federal|.E8_Espirito Santo|.G6_Goias|.G8_Guanabara
G2807-ATLANTIC OCEAN    .B3_Baffin Bay|.M4_Mexico, Gulf of|.N55_North Atlantic Ocean|.N6_North Sea

Выход

G1778-BRAZIL    .A3_Alagoas+G1778-BRAZIL|.A5_Amazonas+G1778-BRAZIL|.B3_Bahia+G1778-BRAZIL|.C4_Ceara+G1778-BRAZIL|.D5_Distrito Federal+G1778-BRAZIL|.E8_Espirito Santo+G1778-BRAZIL|.G6_Goias+G1778-BRAZIL|.G8_Guanabara+G1778-BRAZIL
G2807-ATLANTIC OCEAN    .B3_Baffin Bay+G2807-ATLANTIC OCEAN|.M4_Mexico, Gulf of+G2807-ATLANTIC OCEAN|.N55_North Atlantic Ocean+G2807-ATLANTIC OCEAN|.N6_North Sea+G2807-ATLANTIC OCEAN

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

idk, если этот первый длинный пробел представляет собой табуляцию или несколько пробелов, так что это будет работать в любом случае, если захваченная строка не содержит метасимволов обратной ссылки (например, &) ::

$ awk -F'  +|\t' '{gsub(/[|]|$/,"+"$1"&")}1' file
G1778-BRAZIL    .A3_Alagoas+G1778-BRAZIL|.A5_Amazonas+G1778-BRAZIL|.B3_Bahia+G1778-BRAZIL|.C4_Ceara+G1778-BRAZIL|.D5_Distrito Federal+G1778-BRAZIL|.E8_Espirito Santo+G1778-BRAZIL|.G6_Goias+G1778-BRAZIL|.G8_Guanabara+G1778-BRAZIL
G2807-ATLANTIC OCEAN    .B3_Baffin Bay+G2807-ATLANTIC OCEAN|.M4_Mexico, Gulf of+G2807-ATLANTIC OCEAN|.N55_North Atlantic Ocean+G2807-ATLANTIC OCEAN|.N6_North Sea+G2807-ATLANTIC OCEAN
0 голосов
/ 14 декабря 2018

О, я вижу, что вы делаете сейчас.

perl -F'/[\s|]+/' -nE '
    BEGIN { $, = " " }
    $a = shift @F; 
    say $a, join "|", map {"$_+$a"} @F
' file

или

gawk -F'[[:blank:]|]+' '{
    printf "%s ", $1
    for (i=2; i<=NF; i++) printf "%s+%s%s", $i, $1, i == NF ? ORS : "|"
}' file
...