0

这是我的示例列表:

AAA BBB CCC1
DDD EEE FFF1
GGG HHH III1           <----- I want to remove this
GGG HHH III3 >>updated <----- I want to keep this
JJJ KKK LLL7

当我使用 For 循环遍历列表时,我想记下其中包含“>>updated”的每一行,然后返回一行并删除旧行(未更新),然后前进到“>>更新”行之后的下一行。所以基本上我的最终输出是:

AAA BBB CCC1
DDD EEE FFF1
GGG HHH III3
JJJ KKK LLL7

我正在使用 awk 从 shell 脚本中解析其他字段的值,但我只是不太确定如何向后和向前执行此步骤。任何帮助将不胜感激。

4

5 回答 5

5
awk '{a=$0;getline; if ($0~/>>updated/)print $1,$2,$3; else print a,"\n"$0}' file
AAA BBB CCC1
DDD EEE FFF1
GGG HHH III3
JJJ KKK LLL7
于 2013-05-03T10:00:19.677 回答
4

这可能对您有用(GNU sed):

sed -r '$!N;s/.*\n(.*)\s+>>updated\s*$/\1/;P;D' file

在模式空间中保留两行,当最后一行符合您的要求时删除第一行。

一个 awk 解决方案可能是:

awk 'sub(/ *>>updated.*/,""){l=$0;next};NR>1{print l};{l=$0};END{print l}' file
于 2013-05-03T10:08:17.887 回答
3

tac很好,但不是所有发行版的默认设置。如果您没有它可用,这里有一个 awk 单进程单线:

awk -F' >>' 'p{if($2~/updated/){p=$1;next}print p}{p=$0}END{print p}' file
于 2013-05-03T11:02:09.657 回答
1

最简单的方法是在输入文件中建立一个行数组,但仅在不存在 >>updated 时增加数组索引,以便包含 >>updated 的行覆盖数组中的前一个条目,然后只打印内容到达文件末尾时的数组:

$ cat file
AAA BBB CCC1
DDD EEE FFF1
GGG HHH III1           <----- I want to remove this
GGG HHH III3 >>updated <----- I want to keep this
JJJ KKK LLL7

$ awk '!/>>updated/{++numLines} {line[numLines]=$0} END {for (nr=1;nr<=numLines;nr++) print line[nr]}' file
AAA BBB CCC1
DDD EEE FFF1
GGG HHH III3 >>updated <----- I want to keep this
JJJ KKK LLL7

如果您想删除该行上的 >>updated 和后续文本,您可以将测试是否存在更改为尝试删除它的测试:

$ awk '!sub(/ *>>updated.*/,""){++numLines} {line[numLines]=$0} END{for (nr=1;nr<=numLines;nr++) print line[nr]}' file
AAA BBB CCC1
DDD EEE FFF1
GGG HHH III3
JJJ KKK LLL7

如果存在 >>updated 则 sub() 将删除它并返回成功,因此您知道存在 >>updated,否则 sub() 将不执行任何操作,但返回失败,因此您知道 >>updated 不存在。

于 2013-05-03T12:14:04.763 回答
1
perl -lne 'if(/\>\>updated/){pop @a;s/\>\>updated//g;push @a,$_}else{push @a,$_}END{print join "\n",@a}' your_file

测试:

> cat temp
AAA BBB CCC1
DDD EEE FFF1
GGG HHH III1
GGG HHH III3 >>updated
JJJ KKK LLL7
> perl -lne 'if(/\>\>updated/){pop @a;s/\>\>updated//g;push @a,$_}else{push @a,$_}END{print join "\n",@a}' temp
AAA BBB CCC1
DDD EEE FFF1
GGG HHH III3 
JJJ KKK LLL7
>
于 2013-05-03T11:24:37.280 回答