繁体   English   中英

Bash脚本来过滤文件内容

[英]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]

我的假设是,在同一位置,同一个人不能有多个带有括号内的值的条目。

说明:

  • -r:反向
  • -t:列分隔符
  • -k:关键字段
  • -u:唯一

使用唯一开关排序始终保留重复行的第一个实例。 如果要保留最后一个实例(此处是排序顺序较低的行,即在方括号中包含一个值的行),则必须以相反的顺序对数据进行排序,然后再将其输入到唯一的排序中。

替代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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM