Awk - 如果数字在第 1 列和第 2 列之间,则打印行

Awk - 如果数字在第 1 列和第 2 列之间,则打印行

我有一个数据格式如下的文件。

输入文件

"1930","1946","FOO","BAR","GREEN"
"1949","1962","FOO","BAR","BLUE"
"1970","1980","FOO","BAR","YELLOW"

数字不是连续的,有时会有一些很大的差距。我希望为前两列之间匹配的数字返回以下匹配行。

例子:

1952 号的期望输出

1952:
"1949","1962","FOO","BAR","BLUE"

AWK 或任何 bash 脚本都可以。

答案1

$ awk -F',' -v y=1952 'BEGIN{print y":"} {line=$0;gsub("\"","");} $1+0<=y && y<=$2+0 {print line}' file
1952:
"1949","1962","FOO","BAR","BLUE"

怎么运行的

  • -F','

    这会将字段分隔符设置为逗号。

  • -v y=1952

    这定义了一个y值为 1952 的 awk 变量。

  • BEGIN{print y":";}

    这将打印出标题行。

  • line=$0; gsub("\"","")

    这会将原始行保存为line.然后它从字段中删除双引号。

  • $1+0<=y && y<=$2+0 {print line}

    如果 的值y介于第一列和第二列的值之间,则打印原始line

    在上面的行中,第一列和第二列中的数字添加了零。这确保 awk 将这些列视为数字而不是字符串,因此进行数字比较,而不是字符串比较。

答案2

使用更具体的字段分隔符,紧凑的awk解决方案可以是:

awk -F '(","|^"|"$)' -v d=1952 'd>=$2 && d<=$3'

注意:由于选择了字段分隔符,此处的字段$2$3是各自的字段。添加结束引号 ( "$) 是为了更一般的情况,即任何行都可以只有两个日期,没有更多数据。正如其他评论中所述,标题被省略;否则添加BEGIN{print d":"}.主要部分d>=$2 && d<=$3是不言自明的。

答案3

较短的awk

$ awk -F\" -vn=1952 '$2<=n && $4>=n' file
"1949","1962","FOO","BAR","BLUE"

上面的内容适用于大多数awk基于nawk.

使用源自原始的实现awk,例如oawk,您需要:

oawk -F\" 'BEGIN{n=1952}$2<=n && $4>=n'

答案4

awk ' y>=nq($1) && y<=nq($2)
      function nq(s) {return gensub(/^"|"$/,"","g",s)}
    ' F=, y=1951 file

或者,如果您愿意,可以将变量Fabny紧跟在 后面awk,而不是作为参数

awk -F, -vy=1951 

相关内容