我有一个看起来像这样的文本文件
file:/path/to/file
..
..
DA:34,0,0
DA:86,0,0
DA:87,0,0
..
DA:89,0,0
file:/path/to/file
..
DA:23,0,1
..
DA:24,0,1
DA:25,0,1
..
我只想保留以“ DA”开头的第一行,以“ file”开头的行。以“ DA”开头的其他行必须删除。还有很多其他行(我用“ ..”标记了它们),它们也需要保留。
结果应如下所示:
file:/path/to/file
..
..
DA:34,0,0
..
file:/path/to/file
..
DA:23,0,1
..
..
有人可以帮助我吗?我将非常感谢。谢谢
答案 0 :(得分:0)
这与Printing with sed or awk a line following a matching pattern密切相关。
您追求的是:
awk '/^file/{f=1}(f&&/^DA/){f=0;print}!/^DA/' file
这是如何工作的?
/^file/{f=1}
::如果找到以单词“ file”开头的行,请将标志f
设置为1
(f&&/^DA/){f=0;print}
::如果标志f
不为零,并且行以DA
开头,则打印该行并将标志设置为零。这样可以确保仅在DA
之后打印第一个file
。!/^DA/
:打印所有不以DA
开头的行较短的版本:
awk '/^file/{f=1}(f--&&/^DA/);!/^DA/' file
答案 1 :(得分:-1)
您可以找到所有行的行号 例如这样的
$ a=$(cat test.txt | grep -n DA |cut -f1 -d: | awk 'NR>1' |xargs| tr " " "|" ); echo $a;
4|5|7
然后您可以使用sed删除所有这些
$ awk 'NR!~/^(4|5|7)$/' test.txt;