我有几个格式化了数据的文件。根据文件的不同,格式会有所不同。
基于此,我使用变量来定义位置,所以我只需要在脚本中更改变量。
现在我正在编写的脚本,我想在文件的位置查找数据的“存在”。如果数据存在(非空白),那么我需要将数据分割,并将该数据的一半移动到另一个部分,并将数据的下半部分移动到另一个位置。
下面是一些职位和一些概念性的数据来描述我正在做什么。
现场位置=26
现场位置=41
现场位置=56
字段长度=10
当前数据:

         1         2         3         4         5         6         7
1234567890123456789012345678901234567890123456789012345678901234567890
---------|---------|---------|---------|---------|---------|---------|
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXXZZYYXXWWVVXXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXXMMNNOOPPQQXXXXXAABBCCDDEEZZZZZ

我的问题是(我称之为“字段2”。大多数情况下,这(10)个字符是空的(不是这里所表示的“破折号”)。但是,如果数据确实存在,我需要取前五个字符并将它们放入字段1的前五个字符中,然后需要取字段五的第二个五个字符,并将它们放入字段3的前五个字符中。这10个字符为空的字段需要保持原样(尽管我希望将它们保留为字段,以便插入转义代码,使描述由变量定义的字段的列具有颜色。
渴望的:
         1         2         3         4         5         6         7
1234567890123456789012345678901234567890123456789012345678901234567890
---------|---------|---------|---------|---------|---------|---------|
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXXZZYYX34455XXXXXZZYYXXWWVVXXXXXXWWVVCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXXMMNNO34455XXXXXMMNNOOPPQQXXXXXOPPQQCDDEEZZZZZ

谢谢你的任何想法!
--编辑以显示样本数据的实际位置编号。
肯尼亚先令。

最佳答案

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

关于regex - 如何根据数据的存在替换一行中的某些字符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24767023/

10-11 23:00
查看更多