Awk - 子串比较

时间:2016-02-03 13:13:01

标签: awk comparison substring

使用本机bash代码:

while read line
do

a=${line:112:7}
b=${line:123:7}

if [[ $a != "0000000" || $b != "0000000" ]]
then
    echo "$line" >> FILE_OT_YHAV
else 
    echo "$line" >> FILE_OT_NHAV
fi

done <$FILE_IN

我有以下文件(它是一个虚拟的),被检查的子串都在第4个字段上,所以nm是确切的数字。

AAAAAAAAAAAAAA   XXXXXX BB    CCCCCCC      12312312443430000000
BBBBBBB         AXXXXXX CC    DDDDDDD      10101010000000000000
CCCCCCCCCC C C  QWEQWEE DDD   AAAAAAA     A12312312312312310000

我正在尝试编写一个比较两个特定子串的awk脚本,如果其中一个不是000000,则将该行输出到文件A中,如果它们都是000000,则将该行输出到文件B中,这是代码i到目前为止:

# Before first line.
BEGIN {
print "Awk Started"
FILE_OT_YHAV="FILE_OT_YHAV.test"
FILE_OT_NHAV="FILE_OT_NHAV.test"
FS=""
}

# For each line of input.
{ 
fline=$0
# print "length = @" length($0) "@"
print "length = @" length(fline) "@"
print "##" substr($0,112,7) "##" substr($0,123,7) "##"

if ( (substr($0,112,7) != "0000000") || (substr($0,123,7) != "0000000") )
  print $0 > FILE_OT_YHAV;
else
  print $0 > FILE_OT_NHAV;

}

# After last line.
END {
print "Awk Ended"
}

问题是,当我运行它时,它:  a)将每条线视为具有不同的长度  b)因此,子串应用于它的不同部分(这就是为什么我在if之前添加打印长度的东西,以检查它。

这是行长度awk读取和不同子串的示例输出:

Awk Started
length = @130@
##       ##       ##
length = @136@ 
##0000000##22016  ##
length = @133@
##0000001##16     ##
length = @129@
##0010220##       ##
length = @138@
##0000000##1022016##
length = @136@
##0000000##22016  ##
length = @134@
##0000000##016    ##
length = @137@
##0000000##022016 ##

为什么awk会将长度相同的线条视为具有不同的长度?它与输入文件的间距有关吗?

提前感谢您的帮助。

关于用sed清理文件的评论之后,我得到了这个输出(是的,现在线条有不同的大小):

 1  0M-DM-EM-G M-A.M-E.                 @DEH           M-SM-TM-OM-IM-WM-EM-IM-A M-DM-V/M-DM-T/M-TM-AM-P                      01022016                                                             $
 2  110000080103M-CM-EM-QM-OM-MM-TM-A M-A.               6M-AM-HM-GM-MM-A          1055801001102  0000120000012001001142  19500000120   0100M-D000000000000000000000001022016         $
 3  110000106302M-TM-AM-QM-EM-KM-KM-A                 5M-AM-AM-HM-GM-MM-A          1043801001101  0000100000010001001361  19500000100M-IM-SM-O0100M-D000000000000000000000001022016         $
 4  110000178902M-JM-AM-QM-AM-CM-IM-AM-MM-MM-G M-KM-EM-KM-AM-S        71M-AM-HM-GM-MM-A          1136101001101  0000130000013001006061  19500000130   0100M-D000000000000000000000001022016         $

0 个答案:

没有答案