【问题标题】:How to delete line with specific line numbers and save deleted and the rest?如何删除具有特定行号的行并保存已删除的和其余的?
【发布时间】:2020-02-07 02:59:51
【问题描述】:

test.txt 包含:

this is a line
another line
one more line 

比如这样可以去掉1-2行,剩下的保存到rest.txt中

sed -e '1,2d' test.txt > rest.txt

但原始文件保持不变。那么如何从文件中获取剩余的行呢?在此示例中,我想删除前 2 行,将它们保存到文件“deleted.txt”中,并将第 3 行保存到“rest.txt”中。

【问题讨论】:

  • 请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。
  • 这会工作awk 'NR<=2{print $0 > "deleted.txt"}NR>2{print $0 > "rest.txt"}' test.txt
  • @P..... deleted.txt 是对的,但是 rest.txt 包含 3 '$0'
  • 现已编辑,这是一个错字。更新后重试

标签: sed grep


【解决方案1】:

使用 GNU sed:

seq 1 5 | sed -e '1,2w deleted.txt' -e '1,2d' > rest.txt

w filename: 将当前模式空间写入文件名。

【讨论】:

  • rest.txt 应该包含什么?
  • 5 是文件中的总行号?。另外,在命令中,它没有 test.txt 文件名,但它仍然有效。这是为什么呢?
  • seq 1 5 将数字从 1 发送到 5 到 sed 的 stdin。我想这就是你要找的东西:sed -e '1,2w deleted.txt' -e '1,2d' test.txt > rest.txt
  • 或许sed -e '1,2{w deletedLines' -e 'd}' file > minusDeletedLines?
【解决方案2】:
 awk 'NR<=2{print $0 > "deleted.txt"}NR>2{print $0 > "rest.txt"}' test.txt

对于行(此处为 NR&lt;= 2 将输出重定向到已删除。
对于行(此处为 NR&gt; 2 将输出重定向到 rest.txt。

【讨论】:

  • 一个更具挑战性的问题,随机删除 100 行,这可能无法通过 awk 命令实现。对吗?
  • 不能说不可能。我不知道。
  • 我想删除 m 到 n 之间的任何行怎么办?即 500-5000。这会更笼统。
  • 是的,您可以这样做。 awk 'NR&gt;=m &amp;&amp; NR&lt;=n{print $0 &gt; "deleted.txt"}'。您可以通过awk -v m=500 -v n=5000 ' NR&gt;=m &amp;&amp; NR&lt;=n{print $0 &gt; "deleted.txt"}' 制作mn 变量
  • 试试awk 'NR&gt;=500 &amp;&amp; NR &lt;=5000{print $0 &gt; "deleted.txt"}NR&lt;500{print $0 &gt; "rest.txt"} R&gt;5000{print $0 &gt; "rest.txt"}' test.txt
最近更新 更多