【问题标题】:Remove rows in a csv which has a specific entry in one column and entries in other columns are repeated删除 csv 中的行,该行在一列中有特定条目,而其他列中的条目重复
【发布时间】:2013-05-10 10:08:29
【问题描述】:

我偶然发现了这个问题,我不择手段地解决了这个问题。但我需要你的帮助才能找到一个精确的解决方案。作为awk/sed 的初学者,我无法用一个衬里(我确信有)或awk 脚本来解决它,尽管我可以使用很多管道。

问题来了:

我有一个大的 .csv 文件,其中包含与此类似的条目:

文件(空格分隔)

$ cat file
a d e r None
c f g r a
c f g r None
d a d e c
d a d e None
g f r t None
g f t r None
k f r e d
r e t y None
s c d er d
g f r t 4

没有重复。但是如果你仔细看,第 1、2、3、4 列中有条目是重复的,唯一的变化是第 5 列,'None'。因此,我需要删除在 1、2、3、4 字段中重复并且在第 5 列中有 None 的行(记录)。

这是我编写的代码,它有效,但没有人会推荐:

awk '{print $5,$4,$3,$2,$1}' file | sed 's/None/zzz/g' | sort | awk '!array[$2,$3,$4,$5]++' | sed 's/zzz/None/g'

这是我得到的,我期待的输出。

4 t r f g
a r g f c
c e d a d
d e r f k
d er d c s
None r e d a
None r t f g
None y t e r

zzz 替换None 的目的是在排序后,行将出现在最后,awk 将从剩余列中删除第二次出现的重复项。 反转列序列并将其重新反转回来的原因也是如此。排序。

请帮忙。谢谢!

【问题讨论】:

    标签: unix sed awk


    【解决方案1】:

    我得到了这个解决方案:

    awk '{s=$4" "$3" "$2" "$1; if($5=="None"&& s in a)next;else a[s]=$5" "s}END{for(i in a)print a[i]}' file|sort
    

    它输出:

    kent$  awk '{s=$4" "$3" "$2" "$1; if($5=="None"&& s in a)next;else a[s]=$5" "s}END{for(i in a)print a[i]}' file|sort
    4 t r f g
    a r g f c
    c e d a d
    d er d c s
    d e r f k
    None r e d a
    None r t f g
    None y t e r
    

    似乎和你的预期一样。

    【讨论】:

    • 谢谢@Kent。这行得通。不过花了一些时间才明白!
    猜你喜欢
    • 2014-04-15
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2012-08-06
    相关资源
    最近更新 更多