【问题标题】:how to filter csv to keep rows with the first column ending in +如何过滤csv以保留第一列以+结尾的行
【发布时间】:2015-12-06 11:55:43
【问题描述】:

我正在尝试按第一列过滤 CSV 文件。特别是,我有国家和大陆的大陆名称以“+”符号结尾。例如,我可能在第 1 列中有列元素“Africa +”、“Ryu”、“Europe +”和“Blanka”。

到目前为止,我尝试过 awk -F ',' '$1 ~ /\+/' boomboom.csv > test.txt 无济于事。这可行,但我只想过滤以 + 结尾的名称,而不是带有 + 的名称。

有什么想法吗?

仅供参考,boomboom.csv 文件看起来像这样

...
"Africa +","51","KO","1964","pounds","84","A "
"Africa +","51","KO","1963","pounds","73","O "
"Africa +","51","KO","1962","kg","726","B "
"Ryu","31","Regulation","2000","pounds","40","A "
"Ryu","31","Regulation","2001","pounds","380","B "
...

【问题讨论】:

  • 您是否查看了手册页并试图找出-F 的含义?如果没有,请先尝试。
  • 不符合 hek2mgl 的建议,请尝试使用 csv 解析器。
  • 如果您的语法正确,您的脚本会在第一个字段中打印带有加号的内容。那是你要的吗?还是去掉加号的?
  • 当我问一个问题时,有时是 man cmets,“你试过什么”,好吧,我只是粘贴一些包含“awk”的文本来表明我试过了。”你确实试过了,除了awk,您的简短命令中没有任何部分是正确的。如果您根本不知道 awk 语法,至少做一些谷歌...
  • 你的问题不清楚。显示示例输入文件和所需的输出。

标签: bash csv awk


【解决方案1】:

在 Linux 上,awk 通常由gawk 提供,而您使用的匹配语句$1 ~ /\+/ 称为正则表达式

以后可以参考documentation for gawk regular expressions

与您的问题相当接近的匹配是:

gawk -F ',' '$1 ~ /\+"?$/'

正则表达式\+"?$ 分解如下:

\+ 需要 +\ 转义 + 以表示文字 + 字符为 + 否则在正则表达式中具有特殊含义,即要求其前面的任何内容为“1 个或多个”

"? 表示在+ 之后可能有也可能没有",因为? 字符在正则表达式中具有特殊含义,因为它前面的任何内容都需要“0 或1”

$ 表示在那之后+ 和可能的",字符串结束

此正则表达式将打印变体,例如:

 "apricot+",..
  apricot+,...
 "apricot"+,...

【讨论】:

    【解决方案2】:

    你的问题不清楚,但是这里有一些事情需要考虑。

    如果您只想要大陆,那么您的 awk 语句的本质是:

    awk '{if($1 ~ /\+/) print;}'
    

    如果你只想要国家,那么:

    awk '{if($1 !~ /\+/) print;}'
    

    【讨论】:

    • 这里不需要使用ifs 和prints。这些等价于awk '$1 ~ /\+/'awk '$1 !~ /\+/'
    • 感谢您突出显示较短版本的@Filipe。我有个长篇大论的习惯……
    猜你喜欢
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2019-06-18
    • 2018-07-07
    相关资源
    最近更新 更多