Regex 基于数据的存在,如何替换行中的某些字符。。。?

Regex 基于数据的存在,如何替换行中的某些字符。。。?,regex,linux,awk,sed,Regex,Linux,Awk,Sed,我有几个格式化数据的文件。根据文件的不同,格式会有所不同。 基于此,我使用变量来定义位置,因此我只需在脚本中更改变量 我现在正在编写的脚本,我想在文件的某个位置查找数据的“存在”。如果数据存在(非空),那么我需要分割该数据并将该数据的一半移动到另一个部分,然后将该数据的另一半移动到另一个位置。 下面是一些位置和一些概念数据来描述我正在尝试做的事情 字段1位置=26 字段2位置=41 字段3位置=56 字段长度=10 当前数据: 1 2 3

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

我现在正在编写的脚本,我想在文件的某个位置查找数据的“存在”。如果数据存在(非空),那么我需要分割该数据并将该数据的一半移动到另一个部分,然后将该数据的另一半移动到另一个位置。 下面是一些位置和一些概念数据来描述我正在尝试做的事情

字段1位置=26

字段2位置=41

字段3位置=56

字段长度=10

当前数据:

         1         2         3         4         5         6         7
1234567890123456789012345678901234567890123456789012345678901234567890
---------|---------|---------|---------|---------|---------|---------|    
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXXZZYYXXWWVVXXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXXMMNNOOPPQQXXXXXAABBCCDDEEZZZZZ
我的问题是(我称之为“字段2”。大多数情况下,这(10)个字符是空白的(而不是此处表示的“破折号”)。但是,如果数据确实存在,我需要将前五个字符放入字段1的前五个字符中,然后我需要将字段2的后五个字符放入字段3的前五个字符中。这十个字符为空的字段需要保持原样(尽管我希望将它们保留为字段,以便插入转义码,为列着色,从而描绘由变量定义的字段

期望的:

         1         2         3         4         5         6         7
1234567890123456789012345678901234567890123456789012345678901234567890
---------|---------|---------|---------|---------|---------|---------|    
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXXZZYYX34455XXXXXZZYYXXWWVVXXXXXXWWVVCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXXMMNNO34455XXXXXMMNNOOPPQQXXXXXOPPQQCDDEEZZZZZ
感谢你对这件事的任何想法

--编辑以显示样本数据的实际位置编号。 KSL

您可以通过以下方式将字段位置作为变量传递给awk:

awk -v field1=26 -v field2=41 -v field3=56

我发现您的问题很难理解,但我想向您展示如何使用
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

当然,如果您愿意,您也可以通过变量将FieldWidth的值传递到
awk

这与正则表达式、Linux、awk或sed有什么关系?我在这里没有看到任何代码或Linux特定的内容。如果您发布真实的输入数据和真实的字段位置,那么我将发布一个解决方案。字段2应该保持不变。@tommy、 carstensen,感谢您的关注,但由于数据的性质,我无法发布实际数据。字段位置(在我的情况下)将由变量定义。(在本例中,字段位置为字段1、字段位置为2、字段位置为3);请注意,这些是我的实际字段位置……但我假设您不希望我将行宽度设置为300多个字符。这是很好的观点(除了惰性部分:)我已经编辑了原版以反映样本数据的实际位置数。谢谢汤米,这看起来就像我想要的;但是不知道如何分割这5个字符,或者检查空白空间。在早上的第一件事就检查它。KSL。完美!我需要的,除了变量!我在C中创建了我的变量。sh脚本,所以我引用它们asPerfect!这正是我所需要的,而不是变量!我已经在csh脚本中创建了我的变量,所以我引用它们作为substr($0,“'Field_1_pos',5'),等等。我假设使用-v field1=xx将以相同的方式引用?substr($0,'field1',10)等等?谢谢马克,这看起来真的很棒!目前我正在计算shell变量中的所有字段起始点和字段长度,并将其传递给awk。这看起来简单多了!一定会尝试一下!谢谢!
2014010 10001AABBCCDD XXXXX 1122334455
2014010 10001AABBCCDD XXXXX 1122334455
2014010 10001AABBCCDD XXXXX 1122334455
2014010 10001AABBCCDD XXXXX 1122334455
2014010 10001AABBCCDD XXXXX 1122334455