使用awk/sed从上一行复制值
您知道如何编写awk/sed脚本来替换特定的sentinel值或模式(在本例中,使用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
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