Awk:基于文件的列范围检索行

Awk:基于文件的列范围检索行,awk,Awk,我想从字符83+16中检索具有空格字符的行,并忽略在此范围内具有另一个字符/字符串/整数的所有行 这是我的file.txt: 7653903747235209876401 HGFDKJKK 98765435475237 caJHGFDSQ200 00779999 654321000704 2014100812204898764513165432 7653903747235209854311

我想从字符83+16中检索具有空格字符的行,并忽略在此范围内具有另一个字符/字符串/整数的所有行

这是我的file.txt:

7653903747235209876401            HGFDKJKK      98765435475237        caJHGFDSQ200                00779999        654321000704          2014100812204898764513165432
7653903747235209854311                 KJH      98765435475280             lkjUIHJ100808442700001298765432        654321009999          2014100812204898764513165432
7653903747235209854311                 BBB      98765435475280             lkjUIHJ100808442700001298765432        654321009999          2014100812204898764513165432
7653903747235209876401            GHJUYTHH      98765435475237        caJHGFDSQ200                00779999        654321000704          2014100812204898764513165432
这是我的代码,我想将此条件添加到此代码中:

#!/bin/sh
var='^20141008'
awk -v var=$var '$1~/[01]1$/ && $7 ~ var'  file.txt

您可以将另一个正则表达式匹配项添加到当前awk行:

$ awk -v var="$var" '$1~/[01]1$/ && $7 ~ var && substr($0,83,16) ~ /^ +$/'  file.txt
检查包含从字符83开始的16个字符的子字符串是否与模式匹配。该模式确保字符串的开头和结尾之间只出现空格。

它可以是:

awk -v var="$var" '$1~/[01]1$/ && $7~var && /^.{82} {16}/' file.txt
实际上,引用
$7
可能会导致问题,因为这似乎不是一个空格分隔的列表,而是一个类似COBOL的固定宽度列表。因此,我可以使用绝对位置将其重新解释为单一模式:

var=20141008
awk -v var="$var" 'match($0,"^.{20}[01]1.{60} {16}.{38}"var)' file.txt
或者稍微短一点:

var=20141008
awk '/^.{20}[01]1.{60} {16}.{38}'"$var"'/' file.txt

在旧版gawk中,应添加
--posix
参数以启用区间正则表达式。

您所说的
列83+16列是什么意思?
?前83个字符加上16=>的范围为83到99