如何计算并删除 CSV 文件中带有条件的某些行?

如何计算并删除 CSV 文件中带有条件的某些行?

我有一个 CSV 文件,如下所示:

id,country
12343,China
23455,Japan
47,Singapore
374,Australia
6572e,United Kingdom
  • 首先我想统计列id长度大于3的行总数
  • 接下来我要删除id长度不等于5且id包含字母字符的行
  • 最后我想创建一个新文件来存储结果

我尝试过 awk 方法,但得到以下结果:

mylaptop@MacBook-Pro ~ % awk 'length($1)!=19 {c++} END {print c+0}' myfile
quote> 

如果我输入这样的命令:

mylaptop@MacBook-Pro ~ % awk 'length($1)!=19 {c++} END {print c+0}' <myfile>

它将显示:

zsh: parse error near `\n'

预期输出应类似于 Mac 终端:

mylaptop@MacBook-Pro ~ % awk 'length($1)!=19 {c++} END {print c+0}' myfile
4

并将所有更改保存在文件中。

我是 Linux 新手,所以你能展示 3 个问题的完整命令吗?

答案1

这看起来像是家庭作业!

计算第 1 列长度大于 3 的行数

awk 'length($1)>3 {c++} END {print c+0}'

丢弃第 1 列长度不为 5 的行

awk 'length($1)==5'

丢弃第 1 列长度不是 5 并且包含非数字的行

awk 'length($1)==5 && $1 !~ /[^0-9]/'

使用 shell 将输出定向到新文件。

编辑:该文件最初似乎是制表符分隔的文件,现在已被编辑为 CSV。这意味着解决方案需要

awk -F, 'length($1)>3 {c++} END {print c+0}'
awk -F, 'length($1)==5'
awk -F, 'length($1)==5 && $1 !~ /[^0-9]/'

答案2

要计算第一个逗号分隔字段长度超过三个字符的行数,请删除标题和第一个字段长度不等于四个字符的任何行,然后计算剩余的行数。

sed -e '1d' -e '/^[^,]\{4,\},/!d' file | wc -l

d命令删除由前面的地址(行号或正则表达式)寻址的行。如果不满足上述条件, !d则触发删除。

该表达式^[^,]\{4,\},匹配行开头的四个或更多非逗号,后跟一个逗号。

删除第一个字段长度不精确为五位数字的所有行,同时保留标题并将结果保存到新文件中。

sed -e '1b' -e '/^[[:digit:]]\{5\},/!d' file >newfile

我们使用该b命令分支到第一个输入行的脚本末尾,跳到下一个循环。这样做可以确保打印标题行而不是删除标题行。

该表达式^[[:digit:]]\{5\},恰好匹配行开头的五个数字,后跟一个逗号。

相关内容