我偶然发现了这个问题,我用钩子或骗子解决了这个问题。但我需要你的帮助才能得到精确的解决方案。作为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
将None
替换为zzz
的目的是在排序后,行将显示在最后,awk
将从剩余列中删除第二次出现的重复项。
反转列序列并将其重新反转的原因相同。排序
请你帮忙。谢谢!
答案 0 :(得分:3)
我得到了这个解决方案:
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
它似乎与您的期望相同。