Linux 通过Bash更改txt文件
我有一个文本文件,看起来像Linux 通过Bash更改txt文件,linux,bash,awk,sed,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 .. 我只想在以“file”开头的行之后保留以“DA”开头的第一行。必须删除以“DA”开头的其他行。还有很多其他行(我用“.”标记了它们),它们也需要保留 结果应该如下所示: file:/path/to/file .. ..
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
..
我只想在以“file”开头的行之后保留以“DA”开头的第一行。必须删除以“DA”开头的其他行。还有很多其他行(我用“.”标记了它们),它们也需要保留
结果应该如下所示:
file:/path/to/file
..
..
DA:34,0,0
..
file:/path/to/file
..
DA:23,0,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;
这是非常密切相关的 你所追求的是:
awk '/^file/{f=1}(f&&/^DA/){f=0;print}!/^DA/' file
这是如何工作的?
:如果找到以“file”开头的行,请将标志/^file/{f=1}
设置为f
1
:如果标志(f&&/^DA/){f=0;print}
不是零,并且该行以f
开头,则打印该行并将标志设置为零。这样可以确保只打印DA
之后的第一个文件
DA
:打印所有不以DA开头的行/^DA/
awk '/^file/{f=1}(f--&&/^DA/);!/^DA/' file
您搜索了什么,找到了什么,为什么不起作用?欢迎使用堆栈溢出!对不起,这不是StackOverflow的工作方式。形式为“我想做X,请给我提示和/或示例代码”的问题被认为是离题的。请访问并阅读,尤其是阅读@tripleee并非真正的副本!不同的是,有些行需要打印。重新打开只是因为没有尝试而重新关闭似乎毫无意义。如果OP仍然需要进一步的帮助,可能他们应该简单地发布一个新的和改进的问题,并尽他们最大的努力。我使用了这个命令,但我不能这样做来检查以“file”awk开头的一行又一行的下一个“DA”行!c&/^DA/{c=1;打印;下一个}/^DA/{print}END{print l}'$i.info>temp.info&&mv temp.info$i.info这可能不起作用。我没有看到任何在
文件
之后搜索第一个DA
的检查。哦,对不起,我错了,我以为我们讨论的是不同的文件。我尝试了这个方法,但它只保留以“DA”开头的行的第一次出现。我想要的是在以“file”开头的每一行之后保留以“DA”开头的第一行。谢谢你的回答,非常有帮助。对不起,我是新来的,我会尽量在下个月更好的发布time@MatusSpita没有必要道歉。我们都是新来的,都犯过同样的错误。我强烈建议你做的,看看,并检查了。无论如何,欢迎使用堆栈溢出。