我确实有一个文本文件内的大数据,格式如下:
x, xx, xxx, xxxx, , , ,
x, xx, , xxxx, xxxx,
所以我想从文件中删除逗号后字段号 3 为空的所有行
所以结果会是
x, xx, xxx, xxxx, , , ,
那么该怎么做呢?
答案1
使用 GNU awk
:
$ awk -F' *, *' '$3' file
x, xx, xxx, xxxx, , , ,
我们-F
将字段分隔符设置为正则表达式␣*,␣*
(空格、星号、逗号、空格、星号)。此表达式匹配由零个或多个空格包围的任何逗号。
实际的awk
脚本只是$3
,这意味着如果第三个字段非空,则将打印该行。
答案2
awk解决方案:
awk -F, '$3!~/^[[:space:]]*$/' file
输出:
x, xx, xxx, xxxx, , , ,
-F,
- 字段分隔符$3!~/^[[:space:]]*$/
- 只考虑那些具有非空第三字段(不包含空格)
答案3
珀尔
perl -ne 'print if /^([^,]*,){2}\h*[^\h,]/' yourcsvfile
我们查看前两个 csv 字段,然后检查第二个字段的末尾和第三个字段的开头是否至少有非水平空格、非逗号。当它匹配时,我们就找到了我们的线。
perl -F, -lane 'print if $F[2] =~ /\S/' yourcsvfile
我们将这一行拆分为逗号分隔的字段,存储在 array 中@F
,然后查找第三个字段$F[2]
,看看其中是否至少有一个非空格\S
。
塞德
sed -e '
s/,/\n/2;s/,/\n/2
/\n[[:space:]]*\n/d
y/\n/,/
' yourfile.csv
用换行符标记第三个字段。然后,如果两个标记之间全是空格或没有任何内容,则 => 行将被删除。 OTW,我们默认恢复标记并sed
打印模式空间。