【问题标题】:Changing txt file via Bash [duplicate]通过 Bash 更改 txt 文件 [重复]
【发布时间】:2019-03-20 20:23:47
【问题描述】:

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

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

有人可以帮助我吗?我将不胜感激。谢谢

【问题讨论】:

  • 你搜索了什么,你发现了什么,为什么没有用?
  • 欢迎来到 Stack Overflow!抱歉,这不是 StackOverflow 的工作方式。 “我想做 X,请给我提示和/或示例代码”形式的问题被认为是题外话。请访问help center并阅读How to Ask,尤其是阅读Why is “Can someone help me?” not an actual question?
  • @tripleee 不是真正的重复!不同的是需要打印一些行。
  • 由于缺乏尝试而重新关闭它似乎是毫无意义的。如果 OP 仍然需要进一步的帮助,他们可能应该尽最大努力发布一个新的和改进的问题。
  • 我使用了这个命令,但我不能这样做来检查以 "file" awk '!c && /^DA/{c=1;print 开头的行后的下一个 "DA" 行;next} !/^DA/ {print} END{print l}' $i.info > temp.info && mv temp.info $i.info

标签: linux bash awk sed


【解决方案1】:

这与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 开头,则打印该行并将标志设置为零。这确保您只打印file 之后的第一个DA
  • !/^DA/: 打印所有不以DA 开头的行

更短的版本:

awk '/^file/{f=1}(f--&&/^DA/);!/^DA/' file

【讨论】:

  • 感谢您的回答,非常有帮助。对不起,我是新来的,下次我会努力发帖的
  • @MatusSpita 没有必要道歉。我们都是新来的,都犯了同样的错误。我强烈建议您使用tour 并查看How to Ask 并查看minimal reproducible example。无论如何,欢迎来到 Stack Overflow。
【解决方案2】:

您可以找到所有行的行号 比如这样

$ 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;

【讨论】:

  • 这可能行不通。我没有看到任何检查在 file 之后搜索第一个 DA
  • 哦抱歉,我误以为我们在谈论不同的文件。
  • 我试过这个,但它只保留第一次出现以“DA”开头的行。我想要的是在每行以“file”开头之后保留以“DA”开头的行的第一次出现。不过也谢谢
猜你喜欢
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多