csv中的awk命令:如何打印多个条目?

时间:2016-05-14 00:25:08

标签: bash csv awk

我目前正在开发一个电子表格项目,我需要在其中输出一个只包含列中特定条目的副本。以下是我在第3栏中找到一个条目的内容。

awk -F ',' -v OFS=',' '($3=6411){print}' testdata.csv > testdatacopy.csv

但是如果我想找到6411以及另一个条目,例如6311,我该怎么做?

我试过了:

awk -F ',' -v OFS=',' '($3=6411,6311){print}' testdata.csv > testdatacopy.csv

但这没效果。

3 个答案:

答案 0 :(得分:3)

参考awk boolean operations,您需要awk -F ',' -v OFS=',' '($3~/^6(3[12357]1|399|411)$/){print}' …之类的内容 另请参阅the book on sed and awk中的第一个“注意”。

  

确保您注意到关系运算符“==”(“等于”)与赋值运算符“=”(“等于”)不同。

如果您希望匹配大量可能的值,使布尔表达式变得繁琐,您可以尝试以下方法之一:

  1. 使用与任何正确值匹配的正则表达式 6311
    匹配6321 6331 6351 6371 6399 6411awk … 'BEGIN { '\
  2. 使用值作为索引填写关联数组,允许您测试数组中的成员资格:
    'split("6311 6321 6331 6351 6371 6399 6411", v, " ");'\
    for(i in v){ a[v[i]] = 1;}\
    }($3 in a){print}' file_in.csv > file_out.csv
    awk … '($3>=6311 && $3<=6411)' …
  3. 如果值很幸运地在一个范围内,你只需要测试类似的东西:
    {{1}}

答案 1 :(得分:2)

模式匹配的默认操作是打印:

awk -F, '$3==6411 || $3==6311' testdata.csv > testdatacopy.csv

答案 2 :(得分:0)

或者你可以做一个正则表达式“或”匹配:

awk -F',' -v OFS=',' '($3 ~/6411|6311/){print}' t.csv

编辑:Ed Morton提出了一个很好的观点 - 这将匹配“64112”和“86411”等等,如果ID进入更长的数字,除非您锚定正则表达式以锁定字段的开头和结尾