如果我有类似以下的csv:
1999, random strings go here, £50.00, 983903893
1957, Another lacklustre line, £99.00, 3983093
1987, Adventure UK, £83.83, 39939
1945, North Wales is the Adrenaline Capital of Europe, £78.99, 83983
如何删除字段2中包含3个或更少单词的行。所以输出将是:
1999, random strings go here, £50.00, 983903893
1945, North Wales is the Adrenaline Capital of Europe, £78.99, 83983
我很想说我想使用sed,因为它可以在不需要创建新文件的情况下更改文件。
我知道如何引用第二个字段并使用csv中的sed删除单个单词或符号。例如,我可以使用它来删除问号:
sed -ri ':b s/^([^,]*,[^,]*)\?/\1 /g; t b'
但是,如果有三个或更少的单词,我怎么说我要删除整行?这是我正在努力的一点点。感谢。
编辑:这是文件的实际片段,请参考这个而不是我原来的例子 - 它采用相同的格式,但不同的数据似乎影响了Jean-FrançoisFabre建议的sed行如何处理数据:142106729748,Rocky Horror Book,http://www.ebay.co.uk/itm/Rocky-Horror-Book-/142106729748,0.99
162189532196,Total Film Issue 10,http://www.ebay.co.uk/itm/Total-Film-Issue-10-/162189532196,0.75
162189528365,Total Film Issue 9,http://www.ebay.co.uk/itm/Total-Film-Issue-9-/162189528365,0.99
172328113931,Captain America 163 Silver Age,http://www.ebay.co.uk/itm/Captain-America-163-Silver-Age-/172328113931,2.5
232069020935,Football Picture Story Monthly,http://www.ebay.co.uk/itm/Football-Picture-Story-Monthly-/232069020935,0.25
262606117082,The geographical Tradition ,http://www.ebay.co.uk/itm/geographical-Tradition-/262606117082,10.0
401182170339,Naruto Official Fanbook,http://www.ebay.co.uk/itm/Naruto-Official-Fanbook-/401182170339,3.0
答案 0 :(得分:3)
sed做到了(勉强,但确实如此)
sed -r '/^[^,]+, (\w+[, ]){4,}/!d' text.txt
小解释:
{4,}
匹配由空格或逗号分隔的4个或更多单词(下一个字段)!d
命令不会删除那些(删除不匹配的)-r
选项,否则某些内容将无效\w
结果:
1999, random strings go here, £50.00, 983903893
1945, North Wales is the Adrenaline Capital of Europe, £78.99, 83983
(我实际上不得不用手固定英镑符号:))
编辑:更好,以防TAB在文件中找到它的方式(感谢potong)
sed -r '/^[^,]*,([[:space:]]+[^[:space:],]+){4}/!d'
答案 1 :(得分:2)
Perl解决方案:
perl -waF, -i~ -ne 'print if 3 < split " ", $F[1]' -- text.txt
-w
打开警告-n
逐行读取输入行-a
将每个输入行拆分为@F数组-F
告诉Perl如何拆分它,在这种情况下它使用逗号-i
修改文件,~
将用作备份的后缀split返回字段数。
答案 2 :(得分:1)
使用awk -F ', ' '{split($2, arr, " "); if(length(arr)>=4) print}' file.txt
:
split($2, arr, " ")
arr
通过拆分空间上的第二个字段来创建数组if(length(arr)>=4) print
>=4
仅在数组长度为% cat file.txt
1999, random strings go here, £50.00, 983903893
1957, Another lacklustre line, £99.00, 3983093
1987, Adventure UK, £83.83, 39939
1945, North Wales is the Adrenaline Capital of Europe, £78.99, 83983
% awk -F ', ' '{split($2, arr, " "); if(length(arr)>=4) print}' file.txt
1999, random strings go here, £50.00, 983903893
1945, North Wales is the Adrenaline Capital of Europe, £78.99, 83983
时打印记录
示例:强>
numComparisons = count;
答案 3 :(得分:0)
sed用于单个行上的简单替换,即全部。对于其他任何你应该使用awk:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="tags">
<input type="text" value="" placeholder="Add a tag" />
</div>
<p id="message" style="display:none">You cannot create a duplicate tag.</p>