如何删除第二列中包含3个以上字符的CSV文件中的所有行? E.g:
cave,ape,1
tree,monkey,2
第二行在第二列中包含3个以上的字符,因此将被删除。
答案 0 :(得分:9)
awk -F, 'length($2)<=3' input.txt
答案 1 :(得分:2)
您可以使用此命令:
grep -vE "^[^,]+,[^,]{4,}," test.csv > filtered.csv
grep语法的细分:
-v = remove lines matching
-E = extended regular expression syntax (also -P is perl syntax)
bash stuff:
> filename = overwrite/create a file and fill it with the standard out
正则表达式语法的细分:
"^[^,]+,[^,]{4,},"
^ = beginning of line
[^,] = anything except commas
[^,]+ = 1 or more of anything except commas
, = comma
[^,]{4,} = 4 or more of anything except commas
请注意,如果前两列包含数据中的逗号,则上述内容已经过简化,无法使用。 (它不知道转义逗号和原始逗号之间的区别)
答案 2 :(得分:2)
这是您的数据类型的过滤器脚本。它假设您的数据是在utf8
#!/bin/bash
function px {
local a="$@"
local i=0
while [ $i -lt ${#a} ]
do
printf \\x${a:$i:2}
i=$(($i+2))
done
}
(iconv -f UTF8 -t UTF16 | od -x | cut -b 9- | xargs -n 1) |
if read utf16header
then
px $utf16header
cnt=0
out=''
st=0
while read line
do
if [ "$st" -eq 1 ] ; then
cnt=$(($cnt+1))
fi
if [ "$line" == "002c" ] ; then
st=$(($st+1))
fi
if [ "$line" == "000a" ]
then
out=$out$line
if [[ $cnt -le 3+1 ]] ; then
px $out
fi
cnt=0
out=''
st=0
else
out=$out$line
fi
done
fi | iconv -f UTF16 -t UTF8
答案 3 :(得分:1)
还没有人提供sed
答案,所以这是:
sed -e '/^[^,]*,[^,]\{4\}/d' animal.csv
这是一些测试数据。
>animal.csv cat <<'.'
cave,ape,0
,cat,1
,orangutan,2
large,wolf,3
,dog,4,happy
tree,monkey,5,sad
.
现在来测试一下:
sed -i'' -e '/^[^,]*,[^,]\{4\}/d' animal.csv
cat animal.csv
输出中只应出现猿,猫和狗。