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