我有一个数据格式如下的文件。
输入文件
"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
或者,如果您愿意,可以将变量F
abny
紧跟在 后面awk
,而不是作为参数
awk -F, -vy=1951