使用本机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 $