我有一个 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\},
恰好匹配行开头的五个数字,后跟一个逗号。