【问题标题】:Remove Duplicate and Surrounding Lines From Text File从文本文件中删除重复的和环绕的行
【发布时间】:2015-04-07 06:45:12
【问题描述】:

所以我今天早些时候发布了一个可能过于复杂的问题,所以希望这里有一个更清晰的版本。

我正在尝试编辑文本文件并删除重复的行和围绕它们的行。所以文件看起来像这样几千行:

Info1
Blue
Info1
Info1
Info2
Red
Info2
Info2
Info3   <- Delete line above
Blue    <- Delete Duplicate
Info3   <- Delete two lines below
Info3   <- Delete two lines below

我想编辑或创建一个输出文件,以便删除所有重复的行及其周围的信息。所以上面的示例输出将是:

Info1
Blue
Info1
Info1
Info2
Red
Info2
Info2

这里的要求是我开始尝试的:

#Iterates through multiple files
for f in /dir/*; do
     mv "$f" "$f~" &&
     #unzip and set 2nd line and every fourth line to temp var
     #but then not really sure what to do after this
     gzip -cd "$f~" | sed '2~4s/ = $temp' | gzip > "$f"
 done

【问题讨论】:

  • 请展示您的尝试,SO 不是免费的编码服务。
  • 我建议看看 Linux unique。至少你已经尝试了一些东西并将你的方法放在这里。
  • 伙计,这是 Shell,不是 Python!
  • 是的,我不知道是否有人知道在 python 中编写代码的方法。但我也看过 uniq ,我看起来确实可以做我想要的,但我不知道当 uniq 删除重复行时如何删除周围的行。
  • 与其发布另一个问题,不如澄清第一个问题!

标签: bash awk sed


【解决方案1】:

没什么花哨的,但我认为它应该可以工作,假设数据以需要检查重复的行之前的一行和之后的两行的结构开头并保持:

$ cat brg.txt
Info1
Blue
Info1
Info1
Info2
Red
Info2
Info2
Info3
Blue
Info3
Info3
Info4
Green
Info4
Info4

$ cat brg.awk
NR % 4 == 1 { save = $0 }
NR % 4 == 2 && $0 in seen { flag = 0 }
NR % 4 == 2 && !($0 in seen) { flag = 1; seen[$0]; print save; print }
NR % 4 == 3 && flag
NR % 4 == 0 && flag

$ awk -f brg.awk brg.txt
Info1
Blue
Info1
Info1
Info2
Red
Info2
Info2
Info4
Green
Info4
Info4

【讨论】:

猜你喜欢
  • 2018-01-31
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2017-03-12
  • 2011-09-17
  • 2014-10-30
  • 1970-01-01
相关资源
最近更新 更多