【问题标题】:Getting duplicate entries on multiple sed runs在多次 sed 运行中获取重复条目
【发布时间】:2019-09-21 11:37:24
【问题描述】:

我正在使用以下sed 命令来消除重复项

但它仍然会导致多次运行重复条目

sed -i '/^text1/i\value=value+1' file.txt | uniq

这里uniq 无助于消除重复条目

【问题讨论】:

  • 如果您尝试进行数学运算并操作计数器,我认为value=value+1 不会像您期望的那样与sed 一起工作。您可能应该提供一个 MCVE。它将帮助人们提供答案。另请参阅How to create a Minimal, Complete, and Verifiable example
  • 您成为 SO 成员已经 3 年多了,到目前为止提出了 193 个问题,所以我想现在您应该知道在这个论坛上提出问题需要什么,但如果没有看到 @ 987654322@.
  • @EdMorton 我同意示例文件可能会有所帮助,这也是我的第一个想法。但是如果你看一下代码,就会很清楚发生了什么。
  • @hek2mgl 我已经有太多次试图通过阅读没有做他们想做的事情的代码来弄清楚他们想要什么。即使我确定我理解他们想要做什么,我也只有一半是正确的!在这我可以想象一些可能性,但我真的不知道 OP 想要做什么。

标签: linux shell awk sed sh


【解决方案1】:

首先,当您运行sed -i 时,sed 不会向标准输出输出任何内容。这就是为什么管道到uniq 是没用的。


其次,uniq 需要对输入进行排序才能工作:

sed ... file.txt | sort | uniq > file.txt.tmp
mv file.txt.tmp file.txt

你也可以使用sort-u标志:

sed ... file.txt | sort -u > file.txt.tmp
mv file.txt.tmp file.txt

如果必须保持行的顺序,你可以使用awk:

awk 'seen[$0]++{next} /^text1/{print "value=value+1";print}' file.txt > file.txt.tmp
mv file.txt.tmp file.txt

顺便说一句,现在 GNU awk 提供了一种修改文件的方法:

gawk -i inplace 'seen[$0]++{next} /^text1/{print "value=value+1";print}' file.txt

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    相关资源
    最近更新 更多