Awk:基于文件的一系列列的反向行

时间:2014-10-21 11:02:04

标签: awk

我想检索具有空格字符的行,字符为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

2 个答案:

答案 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参数以启用区间正则表达式。