计算每行出现的字符数
Counting number of character occurrences per line
我有一个如下所示的文件:(注意:A*、B*、C* 是占位符)。文件由 ;
分隔
AAAA;BBBB;CCCCCCCC;DD;EEEEEEEE;FF;
AAA1;BBBBB;CCCC;DD;EEEEEEEE;FFFFF;
AAA3;BB;CCCC;DDDDDDDDD;EEEEEEE;FF;
我正在尝试编写一个小脚本来计算分隔符 ;
的出现次数,如果它小于或大于 5,则将所述行输出到文本文件。
delim=";"
while read line
do
n_of_occ=$(grep -o "$delim" <<< "$line" | wc -l)
if [[ $n_of_occ < 5 ]] || [[ $n_of_occ > 5 ]]
then
echo $line >> outfile
fi
done
出于某种原因,这似乎不起作用,而且我的输出是乱码。有人可以协助或提供不同的方法来解决这个问题吗?也许用 Perl 而不是 bash?
awk
这太简单了:
awk -F\; 'NF!=6' file > outfile
我会选择这条线:
awk '{x=[=10=]}gsub(";","",x)!=5' file
在 Perl 中很简单:
perl -ne 'print if tr/;// != 5' input_file > output_file
-n
逐行读取输入
tr
运算符returns匹配数
使用 sed 你可以这样做:
sed '/^\([^;]*;\)\{5\}$/d' file > outfile
它删除正好有 5 个逗号 (;
) 的行,并将输出发送到 outfile。
或者,如果您希望自己的代码能够正常工作,请进行以下更改:
- 将
done
替换为done <file
- 将
[[
替换为 ((
,将 ]]
替换为 ))
,即使用 ((...))
而不是 [[...]]
不幸的是,示例数据中的每一行都有六个分号,这意味着它们都应该被打印出来。但是,这是一个单行的 Perl 解决方案
$ perl -ne'print if tr/;// != 5' aaa.csv
AAAA;BBBB;CCCCCCCC;DD;EEEEEEEE;FF;
AAA1;BBBBB;CCCC;DD;EEEEEEEE;FFFFF;
AAA3;BB;CCCC;DDDDDDDDD;EEEEEEE;FF;
我有一个如下所示的文件:(注意:A*、B*、C* 是占位符)。文件由 ;
AAAA;BBBB;CCCCCCCC;DD;EEEEEEEE;FF;
AAA1;BBBBB;CCCC;DD;EEEEEEEE;FFFFF;
AAA3;BB;CCCC;DDDDDDDDD;EEEEEEE;FF;
我正在尝试编写一个小脚本来计算分隔符 ;
的出现次数,如果它小于或大于 5,则将所述行输出到文本文件。
delim=";"
while read line
do
n_of_occ=$(grep -o "$delim" <<< "$line" | wc -l)
if [[ $n_of_occ < 5 ]] || [[ $n_of_occ > 5 ]]
then
echo $line >> outfile
fi
done
出于某种原因,这似乎不起作用,而且我的输出是乱码。有人可以协助或提供不同的方法来解决这个问题吗?也许用 Perl 而不是 bash?
awk
这太简单了:
awk -F\; 'NF!=6' file > outfile
我会选择这条线:
awk '{x=[=10=]}gsub(";","",x)!=5' file
在 Perl 中很简单:
perl -ne 'print if tr/;// != 5' input_file > output_file
-n
逐行读取输入tr
运算符returns匹配数
使用 sed 你可以这样做:
sed '/^\([^;]*;\)\{5\}$/d' file > outfile
它删除正好有 5 个逗号 (;
) 的行,并将输出发送到 outfile。
或者,如果您希望自己的代码能够正常工作,请进行以下更改:
- 将
done
替换为done <file
- 将
[[
替换为((
,将]]
替换为))
,即使用((...))
而不是[[...]]
不幸的是,示例数据中的每一行都有六个分号,这意味着它们都应该被打印出来。但是,这是一个单行的 Perl 解决方案
$ perl -ne'print if tr/;// != 5' aaa.csv
AAAA;BBBB;CCCCCCCC;DD;EEEEEEEE;FF;
AAA1;BBBBB;CCCC;DD;EEEEEEEE;FFFFF;
AAA3;BB;CCCC;DDDDDDDDD;EEEEEEE;FF;