我有一个字段,如果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进行内联编辑。
答案 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
开关,并为每一行输入生成输出。
我打赌你现在看到输入中大多数行的重复输出。