【问题标题】:Bash, grep lines from csv based on column 3, if length is 6 chars (numbers)如果长度为 6 个字符(数字),则基于第 3 列来自 csv 的 Bash、grep 行
【发布时间】:2019-12-31 12:24:41
【问题描述】:

问题

我需要在 bash 中,来自 csv 的 grep 行基于 column 3 除以 ,,前提是它仅包含 6 位数字

示例

输入文件。

,11,221951
,11,221952
,11,232928
,11,45
,11,4
,11,5
,11,6
,11,6

输出文件(仅基于第 3 列的行,其中 6 个字符)。

,11,221951
,11,221952
,11,232928

我试过了

cut -d, -f3 input_file.csv | grep -x '.\{6\}'

但它当然会删除前两列。

谢谢。

【问题讨论】:

    标签: bash csv grep width line


    【解决方案1】:

    你可以使用

    awk -F',' '$3 ~ /^[0-9]{6}$/' file > newfile
    

    这里,

    • -F',' 将字段分隔符设置为 ,
    • '$3 ~ /^[0-9]{6}$/' 保留第三个字段值仅包含 6 位数字的行。

    online demo

    s=",11,221951
    ,11,221952
    ,11,232928
    ,11,45
    ,11,4
    ,11,5
    ,11,6
    ,11,6"
    
    awk -F',' '$3 ~ /^[0-9]{6}$/' <<< "$s"
    

    输出:

    ,11,221951
    ,11,221952
    ,11,232928
    

    【讨论】:

    • 谢谢,这正是我需要的,只有数字。 Ravin,您的解决方案也有效,但不仅仅适用于数字。
    • @genderbee,现在我的帖子中也添加了第二个解决方案。
    • @WiktorStribiżew 我不明白?我立即接受了解决方案。
    • @genderbee 请考虑接受答案以完成问题。
    【解决方案2】:

    请您尝试关注一下。

    awk 'BEGIN{FS=","} length($3)==6'  Input_file
    

    如果您想确保所有内容都应该是数字,请尝试:

    awk 'BEGIN{FS=","} match($3,/^[0-9]{6}$/)'  Input_file
    

    【讨论】:

    • 小变化awk -F, 'length($3)==6' file
    【解决方案3】:

    使用 Miller (https://github.com/johnkerl/miller) 运行

    mlr --nidx --fs "," filter -S 'strlen($3)==6' input.csv
    

    你将拥有

    ,11,221951
    ,11,221952
    ,11,232928
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2011-11-15
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      相关资源
      最近更新 更多