使用bak文件CSV在线编辑perl one liner

时间:2015-01-30 16:17:11

标签: perl

我有一个字段,如果csv文件中一行的第11个字段大于6个字符, 需要删除整行。

casoer@casperbox::/here/s/johnny$ head /come/and/play/with/us/danny.csv
D,642,0642,RED,RUM,,M,,L,S,FOREVERRR,0,862,
D,642,0642,RED,RUM,,M,,L,L,WONKY,13783,10196,
D,642,0642,RED,RUM,,M,,L,L,WONKY,13783,10196,
D,642,0642,RED,RUM,,M,,L,L,CRACK?g,221,188,
,642,0642,RED,RUM,,M,,L,L,CRACK?g,221,188,
D,642,0642,RED,RUM,,M,,S,S,TRIP,4169,2858,
D,642,0642,RED,RUM,,M,,S,S,TRIP,4169,2858,
D,642,0642,RED,RUM,,M,,S,S,WRIDE,450,450,
D,642,0642,RED,RUM,,M,,S,S,WRIDE,450,450,
D,642,0642,RED,RUM,,M,,L,L,FOOHK,157,157,

这很有效 -

casoer@casperbox::/here/s/johnny$ perl -nle 'print unless /\,\w{7}\,/' /come/and/play/with/us/danny.csv > /come/and/play/with/us/danny.csv.trap

这将删除行" D,642,0642,RED,RUM ,, M ,, L,S,FOREVERRR,0,862,"

当我尝试整理它时 -

casoer@casperbox::/here/s/johnny$ perl -p -i.bak -nle 'print unless /\,\w{7}\,/' /come/and/play/with/us/danny.csv

创建.bak文件 - 但是" D,642,0642,RED,RUM ,, M ,, L,S,FOREVERRR,0,862,"不会从内联文件中删除。 我想让oneliner创建一个bak up文件,如果我们要让它做-i进行内联编辑。

2 个答案:

答案 0 :(得分:4)

要匹配7个或更多字符,您需要在7之后加入,

在循环的-p阶段中包含print $_导致perl到continue,因此您将在不匹配的行上加倍。

但是,为了匹配第11个字段,更适合在','上自动分割线并测试字段的长度:

perl -i.bak -F, -anwe 'print unless length $F[10] > 6'

请注意,如果您的CSV不包含带引号的逗号,则此功能仅适用于单行。如果您需要更多,则必须查看Text::CSV模块。

答案 1 :(得分:3)

因为您正在使用-p开关,它会覆盖-n开关,并为每一行输入生成输出。

我打赌你现在看到输入中大多数行的重复输出。