我有几个格式化数据的文件。根据文件的不同,格式也会不同。 基于此,我使用变量来定义位置,因此我只需要在脚本中更改变量。
我现在正在处理的剧本,我想寻找“存在”的原因。数据位于文件的位置。如果数据存在(非空白),那么我需要拆分该数据并将该数据的一半移动到另一个部分,并将数据的后半部分移动到另一个位置。 以下是我要尝试做的事情的位置和一些名义数据。
Field_1_Position = 26
Field_2_Position = 41
Field_3_Position = 56
FIELD_LENGTH = 10
当前数据:
1 2 3 4 5 6 7
1234567890123456789012345678901234567890123456789012345678901234567890
---------|---------|---------|---------|---------|---------|---------|
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXXZZYYXXWWVVXXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXXMMNNOOPPQQXXXXXAABBCCDDEEZZZZZ
我的问题在于(我打电话和#34;字段2.大部分时间这些(10)字符都是空白的(不是'破折号'如此处所示!)。但是,如果数据确实存在,我需要取前五个字符并将它们放入Field 1的前五个字符中,然后我需要取field2的后五个字符并将它们放入字段3的前五个字符中。这10个字符是空的需要保持原样(虽然我想将它们保留为字段,因此我可以插入转义码来为列着色描述变量定义的字段。
DESIRED:
1 2 3 4 5 6 7
1234567890123456789012345678901234567890123456789012345678901234567890
---------|---------|---------|---------|---------|---------|---------|
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXXZZYYX34455XXXXXZZYYXXWWVVXXXXXXWWVVCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXXMMNNO34455XXXXXMMNNOOPPQQXXXXXOPPQQCDDEEZZZZZ
感谢对此的任何想法!
- 编辑以显示样本数据的实际位置编号。 KSL。
答案 0 :(得分:2)
cat current.txt \
| awk '{
if(substr($0,41,10)=="----------") {print $0} else {
printf substr($0,1,25)substr($0,41,5)substr($0,31,5)substr($0,36,20)substr($0,46,5)substr($0,61,99)"\n"}}'
您可以将字段位置作为变量传递给awk:
awk -v field1=26 -v field2=41 -v field3=56
答案 1 :(得分:1)
我发现您的问题很难理解,但想要告诉您如何使用gawk
的FIELDWIDTHS变量轻松拆分字段:
awk 'BEGIN{FIELDWIDTHS="7 13 5 10 10 10 10"} {print $1,$2,$3,$4}' file
输出:
2014010 10001AABBCCDD XXXXX 1122334455
2014010 10001AABBCCDD XXXXX 1122334455
2014010 10001AABBCCDD XXXXX 1122334455
2014010 10001AABBCCDD XXXXX 1122334455
2014010 10001AABBCCDD XXXXX 1122334455
当然,如果需要,您也可以通过变量将FIELDWIDTHS的值传递给awk
。