[英]Bash script to filter contents of a file
我有一个看起来像的文件:
Location1 Person1 []
Location1 Person1 [place1, place2]
Location2 Person1 [place1]
我希望输出为:
Location1 Person1 [place1, place2]
Location2 Person1 [place1]
意思是我想告诉awk(或任何其他工具),对于唯一键Location和Person,如果有2个整数,则将该条目放在方括号中。
目前我正在这样做,但没有帮助
awk '!seen[$1$2]++' $FileName > temp.txt
这可能是您想要的:
$ cat tst.awk
/[[][^]]+[]]/ { print; printed[$1,$2]; next }
{ saved[$1,$2] = $0 }
END {
for (key in saved) {
if ( !(key in printed) ) {
print saved[key]
}
}
}
$ awk -f tst.awk file
Location1 Person1 [place1, place2]
Location2 Person1 [place1]
这仅取决于您的要求和尚未与我们共享的输入样本。
放轻松,您不需要awk
!
sort -r file | sort -t" " -k1,2 -u
给你:
Location1 Person1 [place1, place2]
Location2 Person1 [place1]
我的假设是,在同一位置,同一个人不能有多个带有括号内的值的条目。
说明:
使用唯一开关排序始终保留重复行的第一个实例。 如果要保留最后一个实例(此处是排序顺序较低的行,即在方括号中包含一个值的行),则必须以相反的顺序对数据进行排序,然后再将其输入到唯一的排序中。
替代awk
为每个唯一键打印最大数量的值
$ awk '{k=$1 FS $2} (k in v){n=split($0,t,",")}
!(k in v)||n>c[k]{c[k]=n; v[k]=$0}
END{for(k in v) print v[k]}' file
Location1 Person1 [place1, place2]
Location2 Person1 [place1]
如果是平局,这将打印第一行(将n>c[k]
更改为n>=c[k]
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.