如果csv包含低于x个字符串/单词,则从特定字段中删除csv中的行

时间:2016-09-03 20:58:15

标签: linux bash sed

如果我有类似以下的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

4 个答案:

答案 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>