Скопируйте значение из предыдущей строки, используя awk / sed - PullRequest
0 голосов
/ 26 апреля 2019

Есть идеи, как написать сценарий awk / sed для замены определенного значения или шаблона часового значения (в данном случае PREV из значения в столбце, отличном от предыдущей строки?)

например. заменить все PREVs из значения из первого столбца предыдущей строки

a -> b
c -> PREV
d -> PREV

до:

a -> b
c -> a
d -> c

Ответы [ 6 ]

4 голосов
/ 26 апреля 2019
$ awk 'NR>1{$3=p} {p=$1} 1' file
a -> b
c -> a
d -> c

или

awk '{$3=(NR>1)?p:$3;p=$1} 1' file
2 голосов
/ 26 апреля 2019
$ cat file
a -> b
c -> PREV
d -> PREV
e -> f     # watch this record
g -> PREV

Кому заменить все PREV s из значения из первого столбца предыдущей строки , используя awk:

$ awk '$3=="PREV"{$3=prev}{prev=$1}1' file

Выход:

a -> b
c -> a
d -> c
e -> f     # watch this record
g -> e
1 голос
/ 26 апреля 2019

С GNU sed:

sed -E '/PREV/{G;s/PREV(.*)\n(\S+).*/\2\1/};h' infile

Разъяснения:

/PREV/ {                       # if the current line matches PREV
    G                          # append hold space to pattern space
    s/PREV(.*)\n(\S+).*/\2\1/  # replace PREV with first word from appended line,
                               # drop newline and rest of appended line
}
h                              # store pattern space in hold space

Или, с небольшими изменениями для переносимости:

sed '/PREV/{G;s/PREV\(.*\)\n\([^[:blank:]]\{1,\}\).*/\2\1/;};h' infile
1 голос
/ 26 апреля 2019

Golf'd:

$ awk '$3=p?p:$3; {p=$1}' file

a -> b
c -> a
d -> c

на счет $1==0:

$ awk '$3 = length(p)? p: $3; {p=$1}' <<EOF
a -> b
c -> PREV
d -> PREV
0 -> PREV
e -> PREV
f -> PREV
EOF

a -> b
c -> a
d -> c
0 -> d
f -> e
0 голосов
/ 26 апреля 2019

Для этого содержимого

$ cat file
a -> b
c -> PREV
d -> PREV
e -> PREV
g -> GOLD
p -> m

Убедитесь, что заменен только сторож PREV (остальные остались без изменений):

$ awk 'NR>1 && /PREV/{$3=p}{p=$1} 1' file
a -> b
c -> a
d -> c
e -> d
g -> GOLD
p -> m
0 голосов
/ 26 апреля 2019

если ваши данные в файле d, попробуйте на GNU SED:

sed -Ez ':s s/((\S+)\s*->[^\n]+\n[^\n]*)PREV\s*/\1\2\n/;ts' d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...