使用awk/sed从上一行复制值

使用awk/sed从上一行复制值,awk,sed,Awk,Sed,您知道如何编写awk/sed脚本来替换特定的sentinel值或模式(在本例中,PREV来自上一行不同列中的值)吗 e、 g.将前一行第一列的值替换为所有PREVs a -> b c -> PREV d -> PREV 致: 高尔夫球场: $ awk '$3=p?p:$3; {p=$1}' file a -> b c -> a d -> c 要说明$1==0: $ awk '$3 = length(p)? p: $3; {p=$1}' <<E

您知道如何编写awk/sed脚本来替换特定的sentinel值或模式(在本例中,
PREV
来自上一行不同列中的值)吗

e、 g.将前一行第一列的值替换为所有
PREVs

a -> b
c -> PREV
d -> PREV
致:

高尔夫球场:

$ 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
$awk'$3=长度(p)?p:$3;{p=$1}'PREV
d->PREV
0->PREV
e->PREV
f->PREV
EOF
a->b
c->a
d->c
0->d
f->e
使用GNU时:

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
要使用awk替换上一行第一列的值中的所有
PREV
s,请执行以下操作:

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

a -> b
c -> a
d -> c
e -> f     # watch this record
g -> e

如果您的数据在
d
文件中,请在gnu上试用:

sed -Ez ':s s/((\S+)\s*->[^\n]+\n[^\n]*)PREV\s*/\1\2\n/;ts' d
对于此内容

$ cat file
a -> b
c -> PREV
d -> PREV
e -> PREV
g -> GOLD
p -> m
确保仅更换上一个哨兵(其他哨兵保持原样):


对请回答您的问题,说明您尝试了什么,并告诉我们您在哪里需要帮助。分配3美元是个好主意,但我根据我的答案对其进行了调整,可以吗,或者我应该添加一条关于它的注释?在这片荒原中,请按照您的意愿做。有人能解释一下吗?p指的是什么?命令末尾1的作用是什么?thanks@alphaGeek
p
是一个变量,代表前一个变量<代码>1表示打印每行
a -> b
c -> a
d -> c
e -> f     # watch this record
g -> e
sed -Ez ':s s/((\S+)\s*->[^\n]+\n[^\n]*)PREV\s*/\1\2\n/;ts' d
$ cat file
a -> b
c -> PREV
d -> PREV
e -> PREV
g -> GOLD
p -> m
$ awk 'NR>1 && /PREV/{$3=p}{p=$1} 1' file
a -> b
c -> a
d -> c
e -> d
g -> GOLD
p -> m