我有一个带有标签的csv文件,其格式为...,fxx = sth,...并且想检查每个字段可以采用的字段值。目前我使用:
cat data.csv | grep "f10=" | sed 's/.*\(f10=[^,]*\).*/\1/g' | sort | uniq
但是,这只会给我每一行的最后一场比赛,例如:如果一行有...,f10=a,...,f10=b,...
,那么我将始终只获得第二场比赛。
有更好的方法吗?
答案 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