我想检索具有空格字符的行,字符为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
答案 0 :(得分:2)
您可以为当前的awk行添加另一个正则表达式匹配:
$ awk -v var="$var" '$1~/[01]1$/ && $7 ~ var && substr($0,83,16) ~ /^ +$/' file.txt
检查是从字符83开始包含16个字符的子字符串与模式匹配。该模式确保在字符串的开头和结尾之间只出现空格。
答案 1 :(得分:0)
可能是:
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
参数以启用区间正则表达式。