通过Bash更改txt文件

时间:2018-10-16 10:14:10

标签: linux bash awk sed

我有一个看起来像这样的文本文件

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
..
..

有人可以帮助我吗?我将非常感谢。谢谢

2 个答案:

答案 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;