gpt4 book ai didi

bash - 如何根据具有给定值的字段数过滤制表符分隔的输入?

转载 作者:行者123 更新时间:2023-11-29 09:08:28 31 4
gpt4 key购买 nike

我的数据(制表符分隔):

1   0   0   1   0   1   1   0   1
1 1 0 1 0 1 0 1 1
1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0
...

我如何用精确的 grep 行,例如,5'1's,理想输出:

1   0   0   1   0   1   1   0   1

此外,我如何 grep 等于或大于 (>=) 5 '1's 的行,理想输出:

1   0   0   1   0   1   1   0   1
1 1 0 1 0 1 0 1 1
1 1 1 1 1 1 1 1 1

我试过了,

grep 1$'\t'1$'\t'1$'\t'1$'\t'1

但是这只会输出连续的“1”,这不是我想要的。

不知道有没有简单的方法可以实现,谢谢!

最佳答案

John Bollinger's helpful answeranishane's answer表明它可以grep来完成,但是,正如已经指出的那样,这非常麻烦,因为正则表达式不是为计数而设计的。

awk ,相比之下,是为基于字段的解析和计数构建的(通常结合与正则表达式来识别字段分隔符,或者,如下所示,字段本身)。

假设您有 GNU awk ,您可以使用以下内容:

恰好 5 1小号:

awk -v FPAT='\\<1\\>' 'NF==5' file

5 个或更多 1小号:

awk -v FPAT='\\<1\\>' 'NF>=5' file
  • 特殊变量 FPAT是一个 GNU awk允许您通过描述字段本身的正则表达式来识别字段的扩展,与使用正则表达式定义字段之间的分隔符的标准方法(通过特殊变量FS 或选项 -F ):

    • '\\<1\\>'标识任何“孤立的”1 (被非单词字符包围)作为一个字段,基于单词边界断言 \<\> ; \此处必须加倍,以便 awk 执行的初始 string 解析不“吃”单例\ s.
  • 标准变量 NF包含手边行中输入字段的计数,这样可以轻松进行数值比较。如果条件计算结果为真,则隐式打印手头的输入行(换句话说:NF==5 隐式地与 NF==5 { print } 相同,更详细地说,NF==5 { print $0 })。


符合 POSIX 标准 awk解决方案有点复杂:

恰好 5 1小号:

awk '{ l=$0; gsub("[\t0]", "") }; length($0)==5 { print l }' file

5 个或更多 1小号:

awk '{ l=$0; gsub("[\t0]", "") }; length($0)>=5 { print l }' file
  • l=$0将输入行 ( $0 ) 以其原始形式保存在变量 l 中.

  • gsub("[\t0]", "")替换所有 \t0字符。在带有空字符串的输入行中,即有效地删除它们,并且只留下(直接连接)1实例(如果有)。

  • length($0)==5 { print l }然后仅当结果字符串为 l 时才打印原始输入行 ( 1) s(即,现在存储在已修改输入行 (1)中的 $0 s 的计数)与指定的计数相匹配。

关于bash - 如何根据具有给定值的字段数过滤制表符分隔的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37450880/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com