Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 通过Bash更改txt文件_Linux_Bash_Awk_Sed - Fatal编程技术网

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/{f=1}
    如果找到以“file”开头的行,请将标志
    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没有必要道歉。我们都是新来的,都犯过同样的错误。我强烈建议你做的,看看,并检查了。无论如何,欢迎使用堆栈溢出。