sed在文件中查找模式的出现

时间:2011-06-24 15:57:57

标签: sed pattern-matching

我有一个带有标签的csv文件,其格式为...,fxx = sth,...并且想检查每个字段可以采用的字段值。目前我使用:

cat data.csv | grep "f10=" | sed 's/.*\(f10=[^,]*\).*/\1/g' | sort | uniq

但是,这只会给我每一行的最后一场比赛,例如:如果一行有...,f10=a,...,f10=b,...,那么我将始终只获得第二场比赛。

有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

如果该行以逗号结尾,

sed -e 's/,f10=/,X=/g' -e 's/f[0-9]*=[^,]*,*//g' -e 's/X=/f10=/' data.csv

(如果以逗号结尾,那么,最后只添加-e 's/,$//'。)

答案 1 :(得分:1)

如果允许使用perl而不是sed:

grep f10= data.csv | perl -e 'for(<>){ @f=/f10=[^,]+/g; print "@f\n" }' |
sort | uniq

以下是perl脚本的作用:

  • for(<>)遍历从STDIN
  • 获得的行
  • @f=/f10=[^,]+/g与您的正则表达式/f10=[^,]+/匹配,并将所有匹配项存储在@f数组
  • print "@f\n"@f数组的内容打印为以空格和换行符分隔的字符串

答案 2 :(得分:1)

如果我理解正确,它是,分开的csv,那么您可能需要的是:

tr "," "\n" FILE | sed -n '/^f[0-9]\+=/p' | sort | uniq -c

tr将分隔符转换为新行,sed过滤掉没有fXX=部分的行,然后对其进行排序,区分。

HTH