如何根据数据的存在替换一行中的某些字符......?

时间:2014-07-15 19:54:46

标签: regex linux awk sed

我有几个格式化数据的文件。根据文件的不同,格式也会不同。 基于此,我使用变量来定义位置,因此我只需要在脚本中更改变量。

我现在正在处理的剧本,我想寻找“存在”的原因。数据位于文件的位置。如果数据存在(非空白),那么我需要拆分该数据并将该数据的一半移动到另一个部分,并将数据的后半部分移动到另一个位置。 以下是我要尝试做的事情的位置和一些名义数据。

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。

2 个答案:

答案 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